Declaração de suporte restrito à tela

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

Antes de restringir seu aplicativo a determinadas telas, é importante entender todas as técnicas de compatibilidade com várias telas e implementá-las da melhor maneira possível.

Publicar APKs diferentes para telas diferentes

Caso não faça sentido criar um único APK compatível com todas as configurações de tela, o Google Play permite publicar vários APKs para os mesmos detalhes do app. Use esse recurso para fornecer APKs diferentes, cada um compatível com um conjunto diferente de configurações de tela (conforme declarado no arquivo de manifesto) sem criar detalhes separados do app na Google Play Store.

Por exemplo, se você quiser publicar uma versão para smartphone e uma para tablet do seu aplicativo, mas não for possível criar um APK para os dois tamanhos, publique dois APKs nos mesmos detalhes do app. Dependendo da configuração de tela de cada dispositivo, o Google Play fará o download do APK que corresponde ao tamanho da tela de cada dispositivo.

Para mais informações, consulte Como criar vários APKs para tamanhos de tela diferentes.

Declarar uma proporção máxima

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

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

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

Caso não queira que seu app ou atividade seja executado no modo de várias janelas, defina android:resizeableActivity false. Nesse caso, o app sempre ficará em tela cheia. O sistema controla como isso é feito dependendo do nível do SO Android:

  • Se seu aplicativo for voltado para o Android 8.0 (API nível 26) ou posterior, ele preenche a tela inteira, de acordo com o layout.
  • Se seu app for voltado para o Android 7.1 (API nível 25) ou anterior, o sistema limitará o tamanho da interface do app a uma janela com uma proporção de 16:9 (aproximadamente 1,86). Se o aplicativo for executado em um dispositivo com uma proporção de tela maior, o aplicativo aparecerá com efeito letterbox 16:9, o que deixará parte da tela sem uso.

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

Para definir a proporção máxima para o Android 8.0 (API nível 26) ou posterior, 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 Android 7.1 e anteriores, adicione um elemento <meta-data>chamado 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 será aplicada.

Declarar um tamanho máximo de tela

Mesmo se seu aplicativo não for completamente otimizado para oferecer compatibilidade com diferentes tamanhos de tela, o Android ainda poderá esticar a maioria dos apps para 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, já que o APK otimizado para telas grandes terá o versionCode maior. Assim, o Google Play sempre fornece esse APK para dispositivos com tela grande.

No entanto, se você ainda não estiver satisfeito com a forma como o Android redimensiona seu aplicativo para telas grandes, desative o redimensionamento a partir de uma determinada largura especificando o atributo largestWidthLimitDp na tag <supports-screens> do manifesto. Em vez de redimensionar seu layout, o Android ativa o modo de compatibilidade de tela, que desenha seu layout como faria no maior tamanho compatível com seu aplicativo e aumenta todos os pixels para preencher a tela.

Restringir seu app somente para tablets ou TVs

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

O exemplo a seguir declara que somente telas grandes e extra grandes podem instalar o aplicativo:

<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 compatíveis com seu aplicativo usando o elemento <compatible-screens> do manifesto. Porém, recomendamos que você evite usar isso porque qualquer combinação de tamanho e densidade que você não especificar é considerada uma configuração de tela com que seu aplicativo não é compatível. Por isso, usar esse elemento facilita o bloqueio do seu app em vários dispositivos compatíveis com ele.

Um elemento <compatible-screens> precisa conter um ou mais elementos <screen>. Cada elemento <screen> especifica uma configuração de tela com que seu aplicativo é 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 ignoram).

Esta é a aparência da entrada do manifesto se seu aplicativo 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 explicitamente declarada aqui será impedida de instalar o aplicativo.