O Android ativa um modo de compatibilidade para aplicativos que declaram orientação ou restrições de redimensionamento. O modo de compatibilidade garante um comportamento aceitável do app no dispositivos de tela grande e smartphones dobráveis, mas com usabilidade abaixo do ideal.
As substituições por app permitem que os fabricantes de dispositivos mudem comportamento do app para melhorar a experiência do usuário ou evitar que os apps sejam corrompidos a dispositivos específicos.
Dispositivos de referência
Os dispositivos a seguir podem exigir substituições por app devido a exceções configurações ou configurações incompatíveis com apps:
- Tablets:a orientação natural de alguns tablets, como o Pixel Tablet,
é o modo paisagem. Um dispositivo está na orientação natural quando
Display#getRotation()
retorna.Surface.ROTATION_0
Se os apps presumirem queROTATION_0
é um retrato, os layouts do app e a visualização da câmera podem ser incompatíveis com a tela do dispositivo. - Dobráveis em modo paisagem:alguns dispositivos dobráveis, como o Pixel Fold, estão disponíveis. orientação retrato quando dobrada, mas orientação paisagem quando desdobrada. Se os apps presumirem que a orientação desdobrada é retrato, oscilação loops ou problemas de layout.
- Smartphones dobráveis do tipo flip:os smartphones do tipo flip desdobrados normalmente ficam no modo retrato. orientação. Mas, quando dobrados, a tela fica pequena orientação paisagem. Os aplicativos devem identificar e acomodar os diferentes orientações padrão das telas.
Problemas comuns de compatibilidade
Os apps apresentam problemas de compatibilidade com mais frequência devido à orientação do app restrições de tamanho, redimensionamento e proporção, tratamento incorreto de orientação de visualização da câmera e uso indevido de APIs.
Letterboxing
O efeito letterbox posiciona o app no centro da tela ou, em telas grandes, de um lado para o outro para facilitar o acesso. Foscos (barras de cor sólida ou desfocado) preenchem a área de exibição não utilizada nas laterais ou na parte de cima e parte inferior do app.
O efeito letterbox costuma ser usado em dispositivos de tela grande porque as dimensões e a proporção da tela do dispositivo costuma ser diferente das proporções padrão para os quais a maioria dos apps é projetada.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/letterboxing.png?authuser=9&hl=pt-br)
Figura 1. Um app restrito à orientação de retrato tem efeito letterbox no tablet em modo paisagem e no dispositivo dobrável.
Problema
O app não oferece suporte a todas as configurações de tela porque corrigiu o problema orientação fixa, proporção fixa ou não redimensionável.
As configurações que controlam a orientação e a capacidade de redimensionamento do aplicativo incluem os seguintes:
screenOrientation
: especifica uma orientação fixa para de um app. Os aplicativos também podem definir a orientação no tempo de execução usandoActivity#setRequestedOrientation()
resizeableActivity
: indica se o sistema consegue redimensionar apps para caber em janelas de dimensões variadas. No Android 11 (nível da API) 30) e inferior, especifica se os apps oferecem suporte ao modo de várias janelas. Ativado O Android 12 (nível 31 da API) e versões mais recentes especifica se os apps oferecem suporte a modo de várias janelas em telas pequenas (compacto classe de tamanho de janela). No Android 12 e em versões mais recentes, Suporte ao modo de várias janelas em telas grandes (janela média ou expandida) de tamanho personalizado) independentemente dessa configuração.maxAspectRatio
: especifica a proporção máxima. suportado pelo app. Somente apps comresizeableActivity
definido comofalse
podem definamaxAspectRatio
.minAspectRatio
: especifica a proporção mínima. suportado pelo app. Somente apps comresizeableActivity
definido comofalse
podem definaminAspectRatio
.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/letterboxing_issue.png?authuser=9&hl=pt-br)
Um app restrito à orientação retrato não pode ser usado em um dispositivo em modo paisagem.
Otimização
O app precisa oferecer suporte a todos os dispositivos e à tela no modo de várias janelas orientações e tamanhos. Remover toda a orientação e a proporção fixa restrições dos layouts e do arquivo de manifesto do app.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/letterboxing_optimization.png?authuser=9&hl=pt-br)
O app oferece suporte a todas as orientações de dispositivo.
Solução alternativa para compatibilidade
Se um app com orientação ou proporção fixa for executado em uma janela em que o app não oferece suporte direto ao tamanho ou orientação da janela, o Android coloca o app em efeito letterbox para preservar a continuidade.
No Android 12 (nível 31 da API) e 12L (nível 32 da API), a plataforma aplica várias melhorias a aplicativos com efeito letterbox. Dispositivo os fabricantes implementam as melhorias na interface. Não é preciso fazer mais nada desenvolvimento para seu app aproveitar as melhorias.
O Android 12 (nível 31 da API) apresenta as melhorias estéticas abaixo, que podem ser configurados pelos fabricantes dos dispositivos:
- Cantos arredondados: os cantos da janela do app têm uma aparência mais refinada.
- Transparência da barra de sistema:barras de status e navegação, que se sobrepõem à são semitransparentes, tornando os ícones das barras sempre visíveis sobre o com efeito letterbox.
- Proporção configurável:a proporção do app pode ser ajustada para melhorar a aparência dele.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/enhanced_letterboxing.png?authuser=9&hl=pt-br)
Figura 2. App com efeito letterbox com melhorias na interface.
O 12L (nível 32 da API) adicionou estas melhorias funcionais:
Posicionamento configurável:em telas grandes, os fabricantes de dispositivos podem posicione o aplicativo no lado esquerdo ou direito da tela, tornando interação mais fácil.
Botão de reinicialização reformulado:os fabricantes de dispositivos podem autorizar a reinicialização. Botão do modo de compatibilidade de tamanho de um novo visual para um melhor reconhecimento dos usuários.
O Android 13 (nível 33 da API) adiciona uma caixa de diálogo com instruções para o usuário sobre como posicionar o app com efeito letterbox na tela ou incluindo o efeito letterbox no modo de tela dividida:
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/enhanced_letterboxing_user_dialog.png?authuser=9&hl=pt-br)
Figura 3. App com efeito letterbox mostrando a caixa de diálogo com instruções para o usuário.
Modo de compatibilidade de tamanho
O modo de compatibilidade de tamanho inclui o efeito letterbox com um controle de reinicialização. A permite que os usuários reiniciem o app e mostrem de novo a tela. O Android invoca Modo de compatibilidade de tamanho para apps não redimensionáveis. Quando um uma atividade é movida para um contêiner de exibição incompatível com o o sistema pode redimensionar o aplicativo para preencher a tela do dispositivo em pelo menos uma dimensão.
As mudanças na configuração do dispositivo que podem acionar o modo de compatibilidade de tamanho incluem:
- Rotação do dispositivo
- Dobrar ou desdobrar dispositivos dobráveis
- Alternar entre os modos de exibição de tela cheia e tela dividida
Problema
O modo de compatibilidade de tamanho normalmente se aplica a atividades restritas em orientação ou proporção e são configurados (ou determinados pelo sistema) para não ser redimensionável.
O app é considerado redimensionável e não será dimensionado modo de compatibilidade, se ele atender a algum dos critérios a seguir:
- Pode ser redimensionado com
resizeableActivity="true"
. - Oferece suporte ao modo picture-in-picture.
- É incorporado.
- A substituição por app
FORCE_RESIZE_APP
é aplicada por o fabricante do dispositivo (as propriedades definidas pelo app são ignoradas)
Se o app não atender a nenhuma das condições, ele não será considerado redimensionável e pode ser colocado no modo de compatibilidade de tamanho.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/size_compatibility_mode_issue.gif?authuser=9&hl=pt-br)
Um app não redimensionável falha no modo de várias janelas.
Otimização
O app precisa oferecer suporte a todos os tamanhos de tela. Torne seu app redimensionável definindo o
Atributo android:resizeableActivity
de <activity>
ou elemento <application>
para true
no
manifesto do app. Crie layouts responsivos/adaptáveis para seu app. Para mais
informações, consulte
Suporte a tamanhos de tela diferentes e Suporte
no modo de várias janelas.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/size_compatibility_mode_optimization.gif?authuser=9&hl=pt-br)
O app funciona em todos os tamanhos de janela.
Solução alternativa para compatibilidade
O Android coloca um app no modo de compatibilidade de tamanho quando o sistema determina a exibição do aplicativo com efeito letterbox pode ser melhorada, redimensionando o aplicativo para preencher janela de exibição em pelo menos uma dimensão. O sistema exibe um controle de reinicialização que recria o processo do app, recriando a atividade e redesenhando a exibição. Consulte também Visão geral dos processos e threads.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/size_compatibility_mode_workaround.gif?authuser=9&hl=pt-br)
Um app restrito à orientação de retrato sendo mostrado com efeito letterbox na orientação paisagem, redimensionado pelo controle de reinicialização.
Repetições intermitentes
Quando um app não oferece suporte a todas as orientações da tela, ele pode repetir solicitar novas orientações quando ocorrer uma mudança na configuração, criando uma loop infinito que faz a tela piscar ou o app girar indefinidamente.
Problema
No Android 12 (nível 31 da API) e versões mais recentes, os fabricantes de dispositivos podem configurar
ignorar as restrições de orientação especificadas pelos apps e, em vez disso,
aplicar modos de compatibilidade. Por exemplo, um dispositivo dobrável pode ignorar uma
android:screenOrientation="portrait"
da atividade
quando a atividade for exibida no tamanho de tablet no modo paisagem,
na tela interna.
Se as restrições de orientação de um app forem ignoradas, ele poderá programaticamente
define a orientação chamando
Activity#setRequestedOrientation()
A chamada
aciona uma reinicialização do app se ele não estiver processando mudanças de configuração (consulte
Gerenciar mudanças de configuração). Após o
reiniciar, as restrições de orientação do app serão ignoradas, o app repetirá
a chamada para setRequestedOrientation()
, ela aciona uma reinicialização do app e
assim por diante, em um loop autoperpetuador.
Outra maneira de encontrar isso é quando o
orientação natural: a orientação normal conforme
determinada pelo Android) de uma tela de dispositivo é o modo paisagem (ou seja, chamar
Retornos de Display#getRotation()
Surface.ROTATION_0
enquanto o dispositivo está no modo paisagem
proporção). Historicamente, os apps presumem que Display.getRotation() =
Surface.ROTATION_0
significa que o dispositivo está na orientação retrato, mas isso não é.
sempre o caso, por exemplo, na tela interna de alguns dispositivos dobráveis e
em alguns tablets.
Um app na orientação paisagem em uma tela interna dobrável pode verificar a
rotação da tela, receber um valor de ROTATION_0
, assumir a orientação natural
do dispositivo é o modo retrato, e chame
setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
para reconfigurar o layout do app. Depois que o app for reiniciado (no modo paisagem)
orientação), ele poderá verificar novamente a rotação da tela, receber um valor de
ROTATION_0
, ligar
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
e
continuar o loop infinito.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/flickering_loops_issue.gif?authuser=9&hl=pt-br)
Um app somente paisagem no modo retrato faz chamadas repetidas para Activity#setRequestedOrientation()
.
Otimização
Os apps não podem:
- Defina uma orientação padrão com
Activity#setRequestedOrientation()
na do métodoonCreate()
da atividade porque a solicitação de orientação pode ser acionada inesperadamente por mudanças de configuração não processadas - Presumir que a orientação natural do dispositivo (
ROTATION_0
) seja retrato. - Define a orientação com base em sinais não relacionados ao tamanho atual da janela, como
como
Display#getRotation()
, presença de umFoldingFeature
ou APIs descontinuadas.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/flickering_loops_optimization.gif?authuser=9&hl=pt-br)
O app processa mudanças de configuração e não tem restrições de orientação, dessa forma, não entra em uma repetição intermitente.
Solução alternativa para compatibilidade
O Android ignora chamadas para Activity#setRequestedOrientation()
no seguinte:
situações:
a atividade já tiver sido reiniciada em uma chamada anterior para o método; ou o tratamento de rotação forçada de compatibilidade da câmera foi ativado (consulte Câmera prévia abaixo).
Os fabricantes de dispositivos podem aplicar esse comportamento a um app com
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
A atividade fez mais de duas solicitações de orientação em um segundo, o que indica que ocorreu um loop. Das duas solicitações no loop, o Android usa aquela que maximiza a área de exibição do app.
Os fabricantes de dispositivos podem aplicar esse comportamento a um app com
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
Visualização da câmera
A visualização da câmera (ou o visor) dos apps de câmera pode estar desalinhada ou distorcida em tablets, laptops e telas dobráveis.
Problema
O Documento de definição de compatibilidade do Android declara que um o sensor de imagem da câmera "PRECISA estar orientado de forma que a dimensão longa da câmera se alinha com a dimensão longa da tela."
Os apps geralmente presumem que a orientação do dispositivo e do sensor da câmera são retrato, uma suposição razoável em celulares padrão. Mas o a orientação natural de tablets e laptops e os sensores das câmeras podem ser cenário. Além disso, novos formatos, como dobráveis, podem ter vários formatos orientações diferentes e vários sensores de câmera em diferentes orientações.
Iniciar uma atividade com uma orientação de câmera que o app não espera ou alternar entre diferentes câmeras ou telas de dispositivos (para dobráveis) pode causar uma visualização de câmera desalinhada ou distorcida.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/camera_preview_issue.png?authuser=9&hl=pt-br)
Visualização da câmera desalinhada e distorcida em uma tela grande dobrável.
Otimização
Os apps de câmera precisam identificar e gerenciar corretamente a orientação e a câmera do dispositivo orientação do sensor para apresentar uma visualização da câmera alinhada e dimensionada corretamente. Os apps precisam calcular a rotação do dispositivo, a rotação do sensor e a tela ou a janela. proporção e aplique os resultados à visualização da câmera. Para obter consulte Visualização da câmera e Apresentação da câmera Visor.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/camera_preview_optimization.png?authuser=9&hl=pt-br)
Visualização da câmera alinhada e dimensionada corretamente em todas as orientações do dispositivo.
Solução alternativa para compatibilidade
Um dispositivo está na orientação natural quando Display#getRotation()
.
retorna Surface.ROTATION_0
. O sistema calcula
CameraCharacteristics.SENSOR_ORIENTATION
da orientação natural do dispositivo. O Android alinha a janela em modo retrato do
apps restritos ao modo retrato com a orientação natural do dispositivo,
é o que a maioria dos aplicativos espera. O Android também corta a imagem do sensor da câmera quando o
a orientação do sensor é paisagem e a visualização da câmera é retrato. A página
as soluções alternativas incluem:
Forçar a rotação da visualização da câmera em apps restritos ao modo retrato:apps restritas à orientação retrato esperam a orientação natural do dispositivo. e que a orientação do sensor da câmera seja retrato. No entanto, no Android 12, (nível 31 da API) e versões mais recentes, os apps podem ser executados em várias orientações do dispositivo os fabricantes de dispositivos ignoram a especificação de orientação.
Quando um app restrito ao modo retrato estiver conectado à câmera, o Android forçará gira o aplicativo para alinhar a janela em modo retrato com o orientação do dispositivo.
Em alguns tablets (consulte dispositivos de referência), o app da janela em modo retrato é girada para tela cheia no modo retrato para se alinhar com o orientação natural do dispositivo. O app ocupa a tela cheia após o uso de força a rotação de chaves.
Tablet: força a rotação do app restrito ao modo retrato.
Na tela interna de paisagem de dispositivos dobráveis (consulte a referência) dispositivos), as atividades somente no modo retrato são giradas para paisagem para se alinhar com a orientação natural desdobrada. O app é com efeito letterbox após a rotação forçada.
Dobrável: força a rotação do app restrito ao modo retrato. O app também tem efeito letterbox.
Recorte da câmera frontal interna:o sensor da câmera frontal interna em alguns dobráveis estão na orientação paisagem. Além de forçar a rotação visualização da câmera na tela interna dobrável, o Android corta a parte da frente campo de visão da câmera (paisagem) para que o sensor capture uma visão oposta a orientação do dispositivo.
Forçar a atualização das visualizações da câmera:o sistema alterna entre as atividades. métodos
onStop()
eonStart()
(por padrão) ouonPause()
eonResume()
(aplicada pelo OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE substituição por app) após a rotação forçada para garantir que a visualização da câmera seja exibidas corretamente.Dimensionamento da proporção:o sistema muda dinamicamente a proporção do força a rotação da visualização da câmera para uma proporção mínima mais alta, o que garante que a visualização da câmera seja dimensionada corretamente.
Os desenvolvedores de apps poderão substituir essas soluções alternativas se os apps processarem a visualização da câmera. corretamente. Consulte Substituições por app.
APIs usadas indevidamente com frequência
Como o Android adicionou suporte a recursos como o modo de várias janelas e como dobráveis, as APIs legadas foram descontinuadas e substituídas por APIs atualizadas que funcionam para todos os tamanhos de tela e formato de dispositivo fatores No entanto, as APIs descontinuadas ainda estão disponíveis para versões anteriores compatibilidade.
Algumas APIs View
são projetadas para fins especiais que nem sempre funcionam bem
e compreendidos pelos desenvolvedores.
Problema
Os desenvolvedores continuam usando as APIs Display
descontinuadas e presumem incorretamente a
As APIs retornam os limites do app em vez dos limites da área de exibição do dispositivo. Ou os desenvolvedores
usar erroneamente APIs de visualização para fins especiais para conseguir métricas gerais de exibição.
O resultado são erros de cálculo ao reposicionar elementos da interface depois da janela do app.
o redimensionamento de eventos, causando problemas de layout.
APIs Display descontinuadas e usadas indevidamente com frequência:
Para mais informações, consulte Ofereça suporte ao modo de várias janelas.
APIs de visualização usadas indevidamente:
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/misused_APIs_issue.png?authuser=9&hl=pt-br)
Uma API descontinuada calcula de forma incorreta os limites do app. O conteúdo do app sai da tela.
Otimização
Nunca confie no tamanho de exibição físico ao posicionar elementos da interface. Migre seus
para APIs baseadas em WindowMetrics
, incluindo:
APIs WindowManager
:
Plataforma:
Jetpack:
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/misused_APIs_optimization.png?authuser=9&hl=pt-br)
A API calcula corretamente as métricas da janela do app.
Solução alternativa para compatibilidade
Duas substituições ajustam as APIs Display
descontinuadas e uso indevido das APIs View
para
retornar os limites do app:
ALWAYS_SANDBOX_DISPLAY_APIS
para Display
APIs; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
para APIs View
. ALWAYS_SANDBOX_DISPLAY_APIS
também é aplicado por padrão a
apps que se qualificam para o modo de compatibilidade de tamanho.
Atividades transparentes
As atividades transparentes são resultado de estilos de segundo plano transparentes. Por exemplo:
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
Temas relacionados a caixas de diálogo, como Theme.MaterialComponents.Dialog
, podem
incluir estilos que deixem as atividades transparentes.
As atividades transparentes não cobrem todo o espaço de exibição disponível, o que facilita difíceis de gerenciar, pois a área de exibição disponível pode mudar com base mudanças de configuração, como rotação, dobra e desdobramento do dispositivo o modo de várias janelas.
Problema
Uma atividade transparente precisa estar em conformidade com os limites da primeira atividade opaca. abaixo da atividade transparente na pilha de atividades da tarefa. No entanto, uma imagem opaca atividade que inicia uma caixa de diálogo de permissão pode ser uma trampoline (uma atividade que inicia outra atividade e depois desaparece); e o sistema não consegue determinar os limites da atividade trampolim que iniciou a atividade da caixa de diálogo de permissão transparente.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/transparent_activities_issue.png?authuser=9&hl=pt-br)
A caixa de diálogo foi posicionada incorretamente porque a atividade foi iniciada de um trampolim.
Otimização
As atividades transparentes herdam as restrições da camada mais opaca atividade abaixo dela na pilha de atividades de uma tarefa. A atividade opaca precisa ser disponíveis durante todo o ciclo de vida da atividade transparente, desde a atividade da criação à destruição. Por esse motivo, não inicie solicitações de permissão de atividades trampolim.
Se uma atividade trampolim iniciar uma solicitação de permissão, o usuário pode não ser a caixa de diálogo de permissão porque a atividade trampolim foi antes que o usuário tenha a chance de responder à caixa de diálogo, e a as dimensões e a posição da caixa de diálogo podem ter sido calculadas de forma incorreta.
Os apps devem sempre iniciar solicitações de permissão das atividades que permanecem visível até que o usuário decida sobre a permissão.
Bordas arredondadas
Uma atividade pode ser transparente devido a um estilo que especifica o plano de fundo transparência ou porque o conteúdo da atividade não preenche o espaço de exibição. Se uma atividade transparente preencher o espaço de exibição disponível, o sistema automaticamente aplica cantos arredondados à atividade quando configurado para pelo fabricante do dispositivo. Mas, se uma atividade transparente (como um caixa de diálogo de permissão) não preenche o espaço disponível, cabe a você decidir aplicar ou não cantos arredondados.
As caixas de diálogo de permissão não preenchem o espaço de exibição disponível porque elas layout normalmente usa LayoutParams.WRAP_CONTENT, em vez de LayoutParams.MATCH_PARENT.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/transparent_activities_optimization.png?authuser=9&hl=pt-br)
Caixa de diálogo com cantos arredondados posicionados corretamente sobre a atividade de inicialização visível.
Solução alternativa para compatibilidade
Manter as atividades que iniciam atividades da caixa de diálogo visíveis até que o usuário respondeu à caixa de diálogo.
O sistema garante que uma atividade transparente herde todas as restrições da primeira atividade opaca abaixo da atividade transparente na pilha de atividades, incluindo restrições relacionadas a:
- Modo de compatibilidade de tamanho
- Orientação
- Proporção
Jogos do Unity
Os jogos do Unity são executados no modo de tela cheia ou de várias janelas do Android. No entanto, muitos jogos do Unity perdem o foco e param de mostrar conteúdo quando o app é colocado em o modo de várias janelas.
Problema
O Unity adicionou um Resizable Window
.
no Unity 2019.4 para oferecer suporte ao modo de várias janelas no Android. No entanto,
a implementação inicial não reagiu ao ciclo de vida da atividade
o modo de várias janelas corretamente,
O UnityPlayer suspende a reprodução quando o app perde o foco. O player renderizava
tela preta ou o último frame congelado do jogo. A jogabilidade é retomada somente quando
o usuário tocou na tela. Muitos apps que usam o mecanismo do Unity enfrentam esse problema e
renderizar como uma janela preta no modo de várias janelas.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/unity_games_issue.gif?authuser=9&hl=pt-br)
O jogo perde o foco no modo de várias janelas e é renderizado como uma janela preta.
Otimização
Faça upgrade do Unity para a versão 2019.4.40 ou mais recente e exporte seu jogo de novo. Mantenha o
Opção Resizable Window
marcada em
Configurações do player do Android. Caso contrário,
o jogo é pausado quando não está em foco, mesmo que esteja totalmente visível
o modo de várias janelas.
![](https://developer.android.com/static/images/guide/practices/compatibility-mode/unity_games_optimization.gif?authuser=9&hl=pt-br)
O jogo renderiza conteúdo corretamente no modo de várias janelas, mesmo quando não está em foco.
Solução alternativa para compatibilidade
Os fabricantes de dispositivos podem aplicar
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
substituição por app para fornecer um evento de foco falso a um app em
o modo de várias janelas. A substituição permite que a atividade redesenhe o conteúdo e
não serão ocultadas.
Testar um app para verificar problemas de compatibilidade
Para testar seu app e entender como ele se comporta em diferentes formatos, confira: os seguintes recursos:
- Streaming de dispositivos: para testar seu app em dispositivos de produção, incluindo dispositivos de referência) hospedados nos data centers do Google, consulte Streaming de dispositivos Android com a tecnologia do Firebase
- Emuladores no Android Studio Hedgehog:para informações sobre como criar para dispositivos de referência, consulte Criar e gerenciar dispositivos virtuais
- Emulador redimensionável do Android Studio:para informações sobre como acessar outros dispositivos, consulte Executar apps no Android Emulator.
Efeito letterbox
Verifique se cada atividade pode usar todo o espaço de exibição disponível para o app. Primeiro, declare o código a seguir na pasta de teste:
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(); }
Em seguida, execute um teste para declarar o comportamento e garantir que a atividade de destino não esteja com efeito 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(); }); } }
O ideal é executar esse tipo de teste somente até que ele seja aprovado e declare que o atividades ocupam todo o espaço de exibição disponível para o aplicativo. Testar o app em todos os tipos de dispositivos para garantir um comportamento consistente.
Substituições por app
O Android oferece substituições que mudam o comportamento configurado dos apps. Para
exemplo, a substituição FORCE_RESIZE_APP
instrui o
sistema para ignorar o modo de compatibilidade de tamanho e redimensionar o app para caber na tela
dimensões, mesmo que resizeableActivity="false"
seja
especificado no manifesto do app.
Os fabricantes de dispositivos aplicam substituições para alguns apps (ou para todos os apps) em em dispositivos de tela grande específicos. No Android 14 (nível 34 da API) e versões mais recentes, os usuários pode aplicar substituições a apps nas configurações do dispositivo.
Substituições de usuário por app
No Android 14 e versões mais recentes, um menu de configurações permite que os usuários mudem o aspecto proporção de apps. Dispositivos de tela grande, como o de referência dispositivos implementam o menu.
O menu contém uma lista de todos os apps instalados no dispositivo. Os usuários escolhem e defina a proporção dele como 3:4, 1:1, tela cheia ou outro valor. configurado pelo fabricante do dispositivo. Os usuários também podem redefinir a proporção para o padrão do app, que é especificado no manifesto do app.
Os apps podem desativar a substituição de compatibilidade definindo as seguintes tags PackageManager.Property
:
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE (em inglês)
Para desativar a substituição de compatibilidade de proporção do usuário, adicione a propriedade ao manifesto do app e defina o valor como
false
:<application> <property android:name="android.window. PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE" android:value="false" /> </application>
Seu app será excluído da lista nas configurações do dispositivo. Usuários não poderá substituir a proporção do app.
Definir a propriedade como
true
não tem efeito.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
Desativar a opção de tela cheia da compatibilidade com a proporção do usuário substituir, adicione a propriedade ao manifesto do aplicativo e defina o valor como
false
:<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE" android:value="false" /> </application>
A opção de tela cheia é removida da lista de opções de proporção no configurações do dispositivo. Os usuários não poderão aplicar a substituição de tela cheia a seu app.
Definir essa propriedade como
true
não tem efeito.
Otimize o app para todas as telas:não defina restrições de proporção em seu app. Use classes de tamanho de janela para oferecer suporte a diferentes layouts com base na quantidade de espaço de exibição disponível.
Substituições por app do fabricante do dispositivo
Os fabricantes de dispositivos aplicam substituições por app em alguns dispositivos. Os dispositivos de referência podem aplicar algumas substituições a uma vários apps por padrão.
Os apps podem desativar a maioria das substituições. Consulte a seção Por app de substituição abaixo).
É possível testar seu app com substituições ativadas ou desativadas usando a função (consulte Ferramentas do framework de compatibilidade). Depois de aplicadas, as substituições são usadas no app inteiro.
Também é possível usar o Android Debug Bridge (adb) para ativar ou desativar substituições e determinar quais substituições se aplicam ao app.
Ative ou desative as substituições da seguinte maneira:
adb shell am compat enable/disable <override name/id> <package>
Para os dispositivos de referência, verifique quais substituições se aplicam a seu app:
adb shell dumpsys platform_compat | grep <package name>
A tabela a seguir lista as substituições disponíveis e orientações sobre como otimizar o app para que ele não precise depender de substituições. Você pode adicionar flags de propriedade ao manifesto do app para desativar algumas substituições.
Substituições por app | |||
---|---|---|---|
Tipo | Nome | ID | Descrição |
Capacidade de redimensionamento | FORCE_RESIZE_APP | 174042936 | Ignora o modo de compatibilidade de tamanho para o app nas mudanças de configuração. |
FORCE_NON_RESIZE_APP | 181136395 | Força o app a entrar no modo de compatibilidade de tamanho quando há mudanças na configuração. | |
Proporção | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | Substituição intermediária que precisa ser ativada para aplicar todas as outras substituições de proporção. |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | Se ativada (como é o padrão), limita o escopo da substituição a atividades somente na orientação retrato. | |
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | Muda a proporção mínima para 3:2. | |
OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | Muda a proporção mínima para 16:9. | |
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN | 208648326 | Muda a proporção mínima para caber em 50% do tamanho de exibição (ou a proporção de tela dividida). | |
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | Desativa a substituição de proporção mínima para que os apps sejam mostrados em tela cheia quando o dispositivo estiver na orientação retrato. | |
Orientação | OVERRIDE_ANY_ORIENTATION | 265464455 | Permite substituir qualquer orientação. |
OVERRIDE_ANY_ORIENTATION_TO_USER (em inglês) | 310816437 | Modifica as restrições de orientação, redimensionamento e proporção. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | Muda a orientação para retrato quando uma atividade tem a orientação indefinida. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR | 265451093 | Muda a orientação para nosensor (para usar a orientação natural do dispositivo) quando uma atividade tem a orientação indefinida. |
|
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | Gira apps somente paisagem em 180 graus. | |
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | Limita o escopo da substituição de orientação quando o app está conectado à câmera. | |
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | Configura a tela para a orientação natural de paisagem fixa quando uma tarefa é mostrada em tela cheia (inclusive quando tiver o efeito letterbox). | |
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | Ignora as solicitações de orientação do app para evitar repetições infinitas de rotação. | |
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | Ignora solicitações de orientação repetidas enquanto uma atividade é reiniciada. Se o Android detectar que um aplicativo está solicitando pelo menos duas novas orientações em um segundo, o sistema considerará isso uma repetição infinita de rotação e aplicará a substituição. | |
OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | Impede o efeito letterbox desativando a configuração de ignorar a solicitação de orientação pelo fabricante do dispositivo. | |
APIs de sandbox | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | Impede a mudança do comportamento de todas as APIs Display. |
ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | Força as APIs Display a retornar os limites do app. As APIs Display retornam limites lógicos da área de exibição, mas, às vezes, o app presume que as APIs Display retornam os limites dele, o que leva a problemas na interface. |
|
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | Força as APIs View usadas a retornar os limites do app. As APIs View retornam limites lógicos da área de exibição, mas, às vezes, o app presume que as APIs View retornam os limites dele, o que leva a problemas na interface. |
|
Compatibilidade com câmera | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | Desativa a rotação forçada. Por padrão, todos os apps de câmera com orientação fixa são girados à força quando a visualização da câmera está aberta. |
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | Remove a atualização forçada padrão aplicada quando uma visualização da câmera é forçada a girar. | |
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | Muda a atualização forçada para uma atualização suave quando uma visualização da câmera é forçada a girar, o que ajuda a preservar o estado durante a rotação forçada. Por padrão, o Android aplica uma atualização forçada quando a visualização da câmera é girada à força. A atualização forçada pode causar problemas em apps que perdem o estado ou ficam ocultos, dependendo de como armazenam o estado anterior em cache. | |
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | Corta o buffer de imagem na câmera frontal interna. Se a substituição estiver desativada, o corte da câmera frontal interna será removido e o campo de visão será aumentado. Por padrão, em alguns dobráveis (consulte dispositivos de referência), o sistema corta a visualização de todos os apps de câmera ao usar a câmera frontal interna. | |
Diversos | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | Impede que o app seja ocultado quando perder o foco no modo de tela dividida. O app aguarda receber o foco antes de mostrar o conteúdo, o que pode fazer com que o aplicativo congele ou seja ocultado. A substituição permite que o Android envie um evento de foco falso ao app, o que instrui o app a começar a mostrar o conteúdo de novo. |
FORCE_RESIZE_APP
Força os pacotes aos quais a substituição será aplicada a serem redimensionáveis. Não mudar se o app pode ser colocado no modo de várias janelas, mas permite que a app seja redimensionado sem entrar no modo de compatibilidade de tamanho quando a tela for redimensionada.
Como os apps podem ter o mesmo resultado da substituição
No manifesto do app, defina a propriedade
android:resizeableActivity
para true
ou para
oferecer suporte ao redimensionamento e desativar o modo de várias janelas com
android:resizeableActivity=false
, defina android.supports_size_changes
flag de metadados para true
.
Como otimizar apps
Use layouts responsivos/adaptáveis para permitir que os apps se adaptem a todos os tamanhos de tela e proporções. Consulte Suporte a tamanhos de tela diferentes.
Como desativar ou recusar a substituição
Defina a flag de propriedade PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
como
false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
Comandos adb para testar a substituição
Para aplicar a substituição e tornar o app redimensionável:
adb shell am compat enable FORCE_RESIZE_APP <package>
Para remover a substituição:
adb shell am compat disable FORCE_RESIZE_APP <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
FORCE_NON_RESIZE_APP
Força os pacotes aos quais a substituição será aplicada a não serem redimensionáveis e entrar no modo de compatibilidade de tamanho quando houver mudanças na configuração.
Como os apps podem ter o mesmo resultado da substituição
Defina o atributo android:resizeableActivity
e
flag de metadados android.supports_size_changes
para false
no manifesto do app,
e declarar uma restrição de orientação ou proporção.
Como otimizar apps
Todos os apps que se comportam bem quando redimensionados têm que ter
android:resizeableActivity
ou android.supports_size_changes
definido como true
.
Outros apps precisam ser aprimorados para ter um bom comportamento quando redimensionados. Consulte
android:resizeableActivity
Como desativar ou recusar a substituição
Defina a flag de propriedade PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
como
false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
Comandos adb para testar a substituição
Para aplicar a substituição e tornar o app não redimensionável:
adb shell am compat enable FORCE_NON_RESIZE_APP <package>
Para remover a substituição:
adb shell am compat disable FORCE_NON_RESIZE_APP <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_MIN_ASPECT_RATIO
O responsável por todas as substituições que forçam uma determinada proporção mínima.
Como os apps podem ter o mesmo resultado da substituição
Defina android:minAspectRatio
no nível da atividade ou do app.
Como otimizar apps
Não defina restrições de proporção no app. Certifique-se de que seu aplicativo é compatível
diferentes tamanhos de tela. Usar classes de tamanho de janela
para dar suporte a diferentes layouts com base no espaço que seu aplicativo ocupa no
tela. Consulte a API Compose WindowSizeClass
.
e Visualizar a API WindowSizeClass
.
Como desativar ou recusar a substituição
Especifique uma restrição de proporção ou defina a flag de propriedade
PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE
para false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
Restringe as configurações do app que forçam uma determinada proporção mínima para as atividades
somente com orientação retrato. Ativado por padrão e só entra em vigor
se OVERRIDE_MIN_ASPECT_RATIO
também estiver ativado.
Como os apps podem ter o mesmo resultado da substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como otimizar apps
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como desativar ou recusar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
Configura a proporção mínima da atividade como um valor médio (3:2).
Como os apps podem ter o mesmo resultado da substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como otimizar apps
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como desativar ou recusar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_MIN_ASPECT_RATIO_LARGE
Configura a proporção mínima da atividade como um valor alto (16:9).
Como os apps podem ter o mesmo resultado da substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como otimizar apps
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como desativar ou recusar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
Permite o uso da proporção de tela dividida. Permite que um app use todos os disponível no modo de tela dividida, evitando o efeito letterbox.
Como os apps podem ter o mesmo resultado da substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como otimizar apps
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como desativar ou recusar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
Desativa a substituição de proporção mínima em tela cheia no modo retrato para usar tudo espaço na tela disponível.
Como os apps podem ter o mesmo resultado da substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como otimizar apps
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Como desativar ou recusar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_MIN_ASPECT_RATIO.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_ANY_ORIENTATION
Permite que as seguintes substituições substituam qualquer orientação:
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT (em inglês)
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR (em inglês)
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE (link em inglês)
Como os apps podem ter o mesmo resultado da substituição
Defina o atributo de manifesto activity:screenOrientation
.
ou use a API Activity#setRequestedOrientation()
.
Como otimizar apps
O app precisa oferecer suporte a todas as orientações. Uma mudança de orientação
mudança de configuração, que pode ser realizada de duas maneiras: permitindo que o
destruir e recriar o app ou gerenciar as mudanças de configuração.
você mesmo. Se você gerenciar as mudanças de configuração, o estado do app poderá ser
retido usando ViewModel
. Em casos muito limitados, você pode decidir bloquear o
orientação em telas pequenas apenas, embora isso possa não dimensionar
permitindo que o usuário gire o app conforme necessário. No Android 12L e versões mais recentes,
a orientação fixa pode ser substituída pela configuração do dispositivo. Para mais
informações sobre como lidar com mudanças de configuração e oferecer suporte a todos
orientações, consulte Processar mudanças de configuração,
Visão geral do ViewModel e Orientação restrita do app em
smartphones, mas não em dispositivos de tela grande.
Como desativar ou recusar a substituição
Definir a flag de propriedade
PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
para false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_ANY_ORIENTATION_TO_USER
Permite que o app preencha o espaço de exibição disponível. Modifica qualquer orientação,
restrições de redimensionamento e proporção especificadas no manifesto do app. Além disso,
ignora todas as chamadas para
Activity#setRequestedOrientation()
Como os apps podem ter o mesmo resultado da substituição
Não defina o manifesto
android:screenOrientation
. ou defina o atributo como"user"
.Definir o manifesto
android:resizeableActivity
paratrue
.Em telas pequenas, para oferecer suporte ao redimensionamento de apps e desativar o recurso de várias janelas com
android:resizeableActivity=false
, defina o Sinalização de metadadosandroid.supports_size_changes
paratrue
. Não definirminAspectRatio
emaxAspectRatio
.
Como otimizar apps
Ativar o app para oferecer suporte a todas as orientações. Não definir um screenOrientation
no manifesto do app. Ofereça suporte ao redimensionamento de apps,
o modo de várias janelas e todas as proporções de exibição definindo o
android:resizeableActivity
no manifesto do app para true
. Consulte
Suporte a tamanhos de tela diferentes.
Como desativar ou recusar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
Ativa a orientação retrato para todas as atividades no pacote. A menos que OVERRIDE_ANY_ORIENTATION está ativado, a substituição é usado somente quando nenhuma outra orientação fixa tiver sido especificada pela atividade.
Como os apps podem ter o mesmo resultado da substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Como otimizar apps
Consulte OVERRIDE_ANY_ORIENTATION
.
Como desativar ou recusar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
Ativa a orientação nosensor para todas as atividades no . A menos que OVERRIDE_ANY_ORIENTATION seja ativada, a substituição será usada somente quando nenhuma outra orientação fixa tiver sido especificados pela atividade.
Como os apps podem ter o mesmo resultado da substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Como otimizar apps
Consulte OVERRIDE_ANY_ORIENTATION
.
Como desativar ou recusar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Ativa a orientação reverseLandscape para todas as atividades em do pacote. A menos que OVERRIDE_ANY_ORIENTATION seja ativada, a substituição será usada somente quando nenhuma outra orientação fixa tiver sido especificados pela atividade.
Como os apps podem ter o mesmo resultado da substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Como otimizar apps
Consulte OVERRIDE_ANY_ORIENTATION
.
Como desativar ou recusar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
Limites OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR, e LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE as substituições entrem em vigor somente quando a conexão da câmera estiver ativa.
Como os apps podem ter o mesmo resultado da substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Como otimizar apps
Consulte OVERRIDE_ANY_ORIENTATION
.
Como desativar ou recusar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Flags de propriedade para ajustar a substituição
Consulte OVERRIDE_ANY_ORIENTATION
.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
Restringe a orientação da tela para a de paisagem natural quando o seguintes condições sejam atendidas:
- A atividade está em tela cheia.
- Desativar propriedade do componente
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
não está ativado - A configuração para ignorar a solicitação de orientação do fabricante do dispositivo está ativada para o exibir
- A orientação natural da tela é paisagem.
Como os apps podem ter o mesmo resultado da substituição
Não aplicável. O problema precisa ser resolvido usando a lógica do aplicativo.
Como otimizar apps
Consulte OVERRIDE_ANY_ORIENTATION
.
Como desativar ou recusar a substituição
Definir a flag de propriedade
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
para false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
Ativa a política de compatibilidade que ignora a atualização da orientação do aplicativo em resposta ao aplicativo
chamar Activity#setRequestedOrientation()
quando o app
está reiniciando ou tem um tratamento de compatibilidade de câmera ativo.
Como os apps podem ter o mesmo resultado da substituição
Definir flag de propriedade
PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
para true
.
Como otimizar apps
Consulte OVERRIDE_ANY_ORIENTATION
.
Como desativar ou recusar a substituição
Definir flag de propriedade
PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
para false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
android:value="true|false"/>
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
Ativa a política de compatibilidade que ignora a orientação solicitada de um app em
resposta à chamada do app.
Activity#setRequestedOrientation()
mais de duas vezes
em um segundo se uma atividade não tiver efeito letterbox na orientação fixa.
Como os apps podem ter o mesmo resultado da substituição
Não aplicável. O problema precisa ser resolvido usando a lógica do aplicativo.
Como otimizar apps
Consulte OVERRIDE_ANY_ORIENTATION
.
Como desativar ou recusar a substituição
Definir flag de propriedade
PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
a
false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
android:value="false"/>
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION
Exclui pacotes do comportamento de ignorar a solicitação de orientação, que pode ser ativado por fabricantes de dispositivos para uma área de exibição ou para a tela inteira.
Como os apps podem ter o mesmo resultado da substituição
Não aplicável. O problema precisa ser resolvido usando a lógica do aplicativo.
Como otimizar apps
Consulte OVERRIDE_ANY_ORIENTATION
.
Como desativar ou recusar a substituição
Não é possível recusar. Desativar a substituição pode ser perigoso se o app não for compatível. em um dispositivo em que o fabricante ignore a solicitação de orientação. ativada. Entre em contato com o desenvolvedor Android Relações para desativar a substituição.
Flags de propriedade para ajustar a substituição
Não há flags de propriedade para essa substituição.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
NEVER_SANDBOX_DISPLAY_APIS
Força os pacotes a nunca ter o sandbox da API Display
aplicado.
para uma atividade com efeito letterbox ou modo de compatibilidade de tamanho. As APIs Display
continuam a fornecer os limites da área de exibição.
Como os apps podem ter o mesmo resultado da substituição
Declare atividades redimensionáveis definindo a propriedade
Atributo de manifesto android:resizeableActivity
para true
ou a flag de metadados android.supports_size_changes
para true
.
Como otimizar apps
Os apps que declaram ser totalmente redimensionáveis não podem depender do tamanho de exibição
para posicionar elementos da interface. Migre seu app para APIs atualizadas que
forneça WindowMetrics
. Se você estiver usando o Jetpack Compose, aproveite as vantagens da
API WindowSizeClass
para mostrar a interface com base no tamanho da tela
área que o app tem na tela atual. Consulte
Classes de tamanho de janela.
Como desativar ou recusar a substituição
Não é possível recusar. Migre das APIs descontinuadas.
Flags de propriedade para ajustar a substituição
Não há flags de propriedade para essa substituição.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>
Para remover a substituição:
adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
ALWAYS_SANDBOX_DISPLAY_APIS
Força os pacotes a sempre aplicar o sandbox da API Display
.
seja qual for o modo de janelamento. As APIs Display
sempre fornecem os limites do app.
Como os apps podem ter o mesmo resultado da substituição
Declare atividades não redimensionáveis definindo a propriedade
android:resizeableActivity
para false
ou o
Sinalização de metadados android.supports_size_changes
para false
.
Como otimizar apps
Os apps que declaram ser totalmente redimensionáveis não podem depender do tamanho de exibição para
posicionar elementos da interface. Migre seu app de APIs descontinuadas para
APIs atualizadas que oferecem WindowMetrics
. Consulte
WindowMetricsCalculator
Como desativar ou recusar a substituição
Não é possível recusar. Migre das APIs descontinuadas.
Flags de propriedade para ajustar a substituição
Não há flags de propriedade para essa substituição.
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>
Para remover a substituição:
adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
Força os pacotes a colocar as APIs View
abaixo no sandbox para limites de atividade:
Como os apps podem ter o mesmo resultado da substituição
Resolver o problema no código do aplicativo usando APIs que forneçam os limites de a janela do app e os deslocamentos em relação a ela, em vez dos limites do a tela do dispositivo e os deslocamentos em relação a ela.
Como otimizar apps
Os apps precisam usar APIs View
, considerando a possibilidade do efeito letterbox
e o modo de várias janelas sendo aplicados ao app. Consulte
WindowMetricsCalculator
.
Como desativar ou recusar a substituição
Definir flag de propriedade
PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS
para false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
android:value="false"/>
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
Desativa a rotação forçada. Melhora a experiência do usuário em alguns apps.
Como os apps podem ter o mesmo resultado da substituição
Definir flag de propriedade
PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
para false
.
Como otimizar apps
Não confie na orientação do sensor da câmera armazenada em cache ou nas informações do dispositivo. Para orientações sobre compatibilidade da câmera, consulte Apresentação do visor da câmera e do suporte superfícies redimensionáveis na sua câmera do app.
Como desativar ou recusar a substituição
Definir flag de propriedade
PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
para true
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
android:value="true|false"/>
Comandos adb para testar a substituição
Para usar a substituição, que remove a rotação forçada:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Para remover a substituição, que permite que a rotação forçada ocorra:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH
Desativa a atualização de atividades após a rotação forçada. Melhora a experiência do usuário quando a atualização causa perda de estado nos apps.
Como os apps podem ter o mesmo resultado da substituição
Definir flag de propriedade
PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
para false
.
Como otimizar apps
Consulte OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Como desativar ou recusar a substituição
Definir flag de propriedade
PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
para true
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
android:value="true|false"/>
Comandos adb para testar a substituição
Para usar a substituição, que remove a atualização da atividade:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Para remover a substituição, que permite a atualização da atividade:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
Faz com que os pacotes em que é aplicado atualizem a atividade usando um onResume()
.
→ onPause()
→ onResume()
ciclo em vez de onResume()
→
onStop()
→ onResume()
após a compatibilidade da câmera forçar a rotação.
Como os apps podem ter o mesmo resultado da substituição
Definir flag de propriedade
PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
para true
.
Como otimizar apps
Consulte OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Como desativar ou recusar a substituição
Definir flag de propriedade
PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
para false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
android:value="true|false"/>
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT
Força a saída da câmera a ser cortada na orientação oposta quando retrato a orientação da câmera não estiver alinhada com a orientação natural do dispositivo. Muitos apps não processe essa situação e exiba imagens esticadas.
Como os apps podem ter o mesmo resultado da substituição
Definir flag de propriedade
PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
para true
.
Como otimizar apps
Consulte OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Como desativar ou recusar a substituição
Definir flag de propriedade
PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
para false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
android:value="true|false"/>
Comandos adb para testar a substituição
Para usar a substituição, que aplica o corte da câmera frontal interna:
adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Para remover a substituição, que remove o corte da câmera frontal interna:
adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION
Impede que apps desativem o compartilhamento de tela. Consulte
Projeção de mídia). Implementado quando os apps usam indevidamente o
API createConfigForDefaultDisplay()
para forçar
captura em tela cheia e que colocam em risco a privacidade do usuário ao expor o conteúdo.
das notificações, que são capturadas em tela cheia, mas não na tela do app
compartilhamento e todos os apps, independente do modo de janelamento.
Como os apps podem ter o mesmo resultado da substituição
Permitir o comportamento de projeção de mídia padrão (implementado no Android 14, API
nível 34, com createScreenCaptureIntent()
),
para que os usuários decidam se querem compartilhar a tela cheia ou um único app
independente do modo de janelamento. Ou ligue para
createScreenCaptureIntent(MediaProjectionConfig)
com um argumento MediaProjectionConfig
retornado de uma
chamada para createConfigForUserChoice()
.
Como otimizar apps
Permitir que os usuários escolham se querem compartilhar a tela inteira do dispositivo ou um app durante a projeção de mídia, que é o comportamento padrão no Android 14.
Torne seu app redimensionável (resizeableActivity="true"
) para
oferecer suporte ao modo de várias janelas.
Como desativar ou recusar a substituição
Devido à seriedade da privacidade do usuário, seu app não pode desativar ou recusar para essa substituição.
Flags de propriedade para ajustar a substituição
Nenhum.
Comandos adb para testar a substituição
Para aplicar a substituição, que cancela a desativação do compartilhamento de tela parcial pelo app. (ou seja, ativa o compartilhamento de tela parcial):
adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Para remover a substituição, que permite que o app desative a tela parcial. compartilhamento:
adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
Ativa o envio de foco falso para apps sem foco no modo de tela dividida. Algumas os mecanismos de jogos esperam receber o foco antes de desenhar o conteúdo do app; e assim, o foco falso ajuda os apps a evitar que fiquem ocultos quando são retomados e não mas mantenham o foco.
Como os apps podem ter o mesmo resultado da substituição
Definir flag de propriedade
PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
para
true
.
Como otimizar apps
É possível evitar esse problema caso seu app processe várias orientações e as mudanças de configuração. Prepare o app para telas grandes seguindo as Diretrizes de qualidade de apps para telas grandes.
Se você usa o mecanismo de jogo do Unity, faça upgrade para a versão 2019.4.40 ou mais recente.
o jogo será exportado novamente. Manter a opção Resizable Window
marcada no Player do Android
configurações.
Como desativar ou recusar a substituição
Definir flag de propriedade
PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
para
false
.
Flags de propriedade para ajustar a substituição
<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
android:value="true|false"/>
Comandos adb para testar a substituição
Para aplicar a substituição:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
Para remover a substituição:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
Observação: os comandos só aplicam ou removem a substituição temporariamente.