Declarar o suporte restrito a telas

Embora seja altamente recomendável projetar seu app para que ele possa se adaptar a todos os tamanhos e densidades de tela, talvez você ainda não queira que ele ofereça suporte a determinadas configurações de tela. Nesse caso, você pode limitar o quanto o Android pode redimensionar seu app ou até mesmo restringir os dispositivos que podem instalá-lo, conforme descrito nesta página.

Antes de restringir seu app a determinadas telas, é necessário entender todas as técnicas para oferecer suporte a várias telas e implementá-las da melhor maneira possível.

Publicar artefatos separados para telas diferentes

Caso não seja razoável criar um único app compatível com todas as configurações de tela, o Google Play permite publicar várias versões da mesma página "Detalhes do app". Use esse recurso para fornecer artefatos separados que oferecem suporte a um conjunto diferente de configurações de tela, conforme declarado no arquivo de manifesto, sem criar páginas "Detalhes do app" separadas na Google Play Store.

Por exemplo, se você quiser publicar uma versão para dispositivos móveis e uma versão para tablet do seu app, mas não é possível que um APK funcione para os dois tamanhos de tela, publique dois APKs na mesma página "Detalhes do app". Dependendo da configuração de tela de cada dispositivo, o Google Play faz o download do APK que corresponde ao tamanho da tela de cada dispositivo. Ao publicar usando Android App Bundles, os APKs enviados são otimizados automaticamente para a densidade da tela. No entanto, o mesmo método precisa ser usado em casos de segmentação por tamanho de tela.

Para saber mais, consulte Como criar vários APKs para diferentes tamanhos de tela.

Declarar uma proporção máxima

Para oferecer suporte ao maior número possível de dispositivos, um app precisa adaptar dinamicamente o layout para garantir que o conteúdo e os controles sejam visíveis e bem organizados.

A maioria dos apps também precisa ser redimensionável para que o usuário possa executá-los no modo de várias janelas. O usuário pode iniciar uma atividade de redimensionamento nos modos de tela dividida e formato livre e mudar o tamanho da atividade arrastando as laterais ou os cantos.

O modo de várias janelas está disponível para todos os apps executados no Android 7.0 (nível 24 da API) ou versões mais recentes, e os apps são redimensionáveis por padrão. Também é possível definir explicitamente o atributo android:resizeableActivity=true para um app inteiro ou para atividades específicas.

O Android 12 (API de nível 31) assume como padrão o modo de várias janelas. Em telas grandes (com 600 dp ou mais), todos os apps são executados no modo de várias janelas, seja qual for a configuração deles. Se for resizeableActivity="false", o app será colocado em modo de compatibilidade quando necessário para atender às dimensões de exibição. Em telas pequenas (com menos de 600 dp), o sistema verifica as configurações minWidth, minHeight e resizeableActivity de uma atividade para determinar se ela pode ser executada no modo de várias janelas. Se resizeableActivity="false", a atividade não vai oferecer suporte ao modo de várias janelas, independente da largura e altura mínimas da atividade.

Nos níveis 30 e anteriores da API, se você não quiser que o app ou a atividade seja executado no modo de várias janelas, defina resizeableActivity=false. Nesse caso, o app sempre aparece em tela cheia. O sistema controla como isso é feito, dependendo do nível do SO Android:

  • Se o app for direcionado ao Android 8.0 (nível 26 da API) ao Android 11 (nível 30 da API), ele preencherá toda a tela de acordo com o layout.
  • Se o app for direcionado ao Android 7.1 (nível 25 da API) ou versões anteriores, o sistema vai limitar o tamanho da interface do app a uma janela com proporção de 16:9 (aproximadamente 1,86). Se o app for executado em um dispositivo com uma proporção de tela maior, ele vai aparecer com efeito letterbox de 16:9, deixando parte da tela sem uso.

Se o layout do app não puder se adaptar a proporções arbitrariamente grandes, você pode aplicar explicitamente o efeito letterbox em todos os níveis do SO Android definindo uma proporção máxima. Recomendamos uma proporção de 2.4 (12:5). Seu app terá efeito letterbox quando for executado em um dispositivo com uma proporção maior que a especificada. O valor escolhido precisa ser de pelo menos 1,0 para dispositivos Wear OS e de 1,33 para outros dispositivos. Se você especificar uma proporção menor que esses limites, o sistema vai restringir a proporção do seu app dependendo do nível do SO, conforme descrito acima.

Para definir a proporção máxima para o Android 8.0 (nível 26 da API) e versões mais recentes, declare a proporção máxima usando android:maxAspectRatio na sua tag <activity>. O exemplo a seguir mostra como declarar uma proporção máxima de 2,4:

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<activity android:maxAspectRatio="2.4">
 ...
</activity>

Para o Android 7.1 e versões anteriores, adicione um elemento <meta-data> com o nome android.max_aspect no elemento <application> da seguinte maneira:

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<meta-data android:name="android.max_aspect" android:value="2.4" />

Se você definir uma proporção máxima, não se esqueça de definir android:resizeableActivity false também. Caso contrário, a proporção máxima não terá efeito.

Declarar um tamanho máximo de tela

Mesmo que o app não seja completamente otimizado para oferecer suporte a diferentes tamanhos de tela, o Android ainda poderá estender a maioria dos apps para que se ajustem a telas maiores. Portanto, quase nunca é necessário declarar um tamanho máximo de tela.

Se você decidir criar vários APKs para diferentes tamanhos de tela, não será necessário limitar um APK somente a telas pequenas. Isso acontece porque o APK otimizado para telas grandes precisa ter o versionCode maior. Portanto, o Google Play sempre fornece esse APK a dispositivos com telas grandes.

No entanto, se você ainda não estiver contente com a forma como o Android redimensiona seu app para telas grandes, é possível desativar o redimensionamento além de uma determinada largura especificando o atributo largestWidthLimitDp na tag <supports-screens> do manifesto. Em vez de redimensionar o layout, o Android ativa o modo de compatibilidade de tela, que desenha o layout da mesma forma que faria no maior tamanho com suporte do app e, em seguida, aumenta todos os pixels para preencher a tela.

Restringir seu app somente para tablets ou TVs

É possível impedir que dispositivos móveis façam o download do seu app usando o elemento <supports-screens> do manifesto.

O exemplo a seguir declara que apenas telas grandes e extra grandes precisam instalar o app:

<manifest ... >
    <supports-screens android:smallScreens="false"
                      android:normalScreens="false"
                      android:largeScreens="true"
                      android:xlargeScreens="true"/>
    ...
</manifest>

Restringir seu aplicativo a tamanhos e densidades específicos

É possível definir os tamanhos e densidades exatos de tela com que seu app tem suporte usando o elemento de manifesto <compatible-screens>. No entanto, recomendamos evitar o uso desse método, porque qualquer combinação de tamanho e densidade que você não especificar será considerada uma configuração de tela com que seu app não é compatível. Portanto, o uso desse elemento facilita o bloqueio do seu app em vários dispositivos para os quais ele tem suporte.

O elemento <compatible-screens> precisa conter um ou mais elementos <screen>. Cada elemento <screen> especifica uma configuração de tela com que seu app é compatível usando os atributos android:screenSize e android:screenDensity. Cada elemento <screen> precisa incluir os dois atributos para especificar uma configuração de tela individual. Se um dos atributos estiver ausente, o elemento será inválido (serviços externos como o Google Play o ignorarão).

A entrada do manifesto será parecida com o exemplo abaixo se o app for compatível apenas com tamanhos de tela pequenos e normais (e um subconjunto de densidades de tela):

<manifest ... >
    <compatible-screens>
        <!-- all small size screens -->
        <screen android:screenSize="small" android:screenDensity="ldpi" />
        <screen android:screenSize="small" android:screenDensity="mdpi" />
        <screen android:screenSize="small" android:screenDensity="hdpi" />
        <screen android:screenSize="small" android:screenDensity="xhdpi" />
        <!-- all normal size screens -->
        <screen android:screenSize="normal" android:screenDensity="ldpi" />
        <screen android:screenSize="normal" android:screenDensity="mdpi" />
        <screen android:screenSize="normal" android:screenDensity="hdpi" />
        <screen android:screenSize="normal" android:screenDensity="xhdpi" />
    </compatible-screens>
    ...
    <application ... >
        ...
    <application>
</manifest>

Qualquer combinação de tamanho e densidade não declarada aqui será impedida de instalar o app.