Cómo declarar una compatibilidad de pantalla restringida

Si bien recomendamos que diseñes tu app de modo que se adapte a todos los tamaños y densidades de pantalla, es posible que no desees que sea compatible con ciertas configuraciones de pantalla. En ese caso, puedes limitar en qué medida Android puede cambiar el tamaño de tu app o incluso restringir los dispositivos que pueden instalarla, como se describe en esta página.

Antes de restringir tu app a ciertas pantallas, debes comprender todas las técnicas para admitir varias pantallas e implementarlas de la mejor manera posible.

Publica artefactos independientes para diferentes pantallas

En caso de que te resulte injustificado compilar una sola app que admita todas las configuraciones de pantalla, Google Play te permite publicar varias versiones para la misma ficha de la app. Puedes usar esta función para proporcionar artefactos independientes que admitan un conjunto diferente de configuraciones de pantalla (como se declara en el archivo de manifiesto) sin crear fichas separadas en Google Play Store.

Por ejemplo, si quieres publicar una versión de teléfono y una versión de tablet de tu app, pero no puedes hacer que un APK funcione para ambos tamaños de pantalla, puedes publicar dos APK para la misma ficha de la app. Según la configuración de pantalla de cada dispositivo, Google Play descargará el APK que coincida con el tamaño de pantalla de cada dispositivo. Ten en cuenta que, cuando se publica con Android App Bundles, los APKs entregados se optimizan automáticamente para la densidad de la pantalla. Sin embargo, en el caso de la segmentación por tamaño de pantalla, se debe usar el mismo método.

Para obtener más información, consulta Cómo crear varios APK para diferentes tamaños de pantalla.

Declara una relación de aspecto máxima

Para admitir tantos dispositivos como sea posible, una app debe adaptar su diseño de forma dinámica para garantizar que su contenido y sus controles sean visibles y bien organizados.

La mayoría de las apps también deben poder cambiar de tamaño para que el usuario pueda ejecutarlas en el modo multiventana. El usuario puede iniciar una actividad que puede cambiar de tamaño en los modos de pantalla dividida y de formato libre, y cambiar el tamaño de la actividad arrastrando sus lados o esquinas.

El modo multiventana está disponible para todas las apps que se ejecutan en Android 7.0 (nivel de API 24) o versiones posteriores. Además, es posible cambiar el tamaño de las apps de forma predeterminada. También puedes configurar de forma explícita el atributo android:resizeableActivity=true para una app completa o actividades específicas.

De forma predeterminada, Android 12 (nivel de API 31) establece el modo multiventana. En pantallas grandes (ancho mínimo >= 600 dp), todas las apps se ejecutan en el modo multiventana, independientemente de la configuración de la app. Si es resizeableActivity="false", la app se pone en modo de compatibilidad cuando es necesario para ajustarse a las dimensiones de la pantalla. En pantallas pequeñas (ancho mínimo < 600 dp), el sistema verifica la configuración de minWidth, minHeight y resizeableActivity de una actividad para determinar si esta puede ejecutarse en el modo multiventana. Si se establece resizeableActivity="false", la actividad no admite el modo multiventana, independientemente del ancho y la altura mínimos de la actividad.

En el nivel de API 30 y versiones anteriores, si no quieres que tu app o actividad se ejecuten en el modo multiventana, configura resizeableActivity=false. En ese caso, la app siempre aparecerá en pantalla completa. El sistema controla cómo se hace esto, según el nivel del SO Android:

  • Si tu app está orientada a Android 8.0 (nivel de API 26) a Android 11 (nivel de API 30), ocupará toda la pantalla según su diseño.
  • Si tu app se orienta a Android 7.1 (nivel de API 25) o versiones anteriores, el sistema limita el tamaño de la interfaz de la app a una ventana con una relación de aspecto de 16:9 (aproximadamente 1.86). Si la app se ejecuta en un dispositivo con una relación de aspecto de pantalla más grande, aparecerá en formato letterbox de 16:9, que deja parte de la pantalla sin usar.

Si el diseño de tu app no se puede adaptar a relaciones de aspecto arbitrariamente grandes, puedes aplicar el formato letterbox de forma explícita en todos los niveles del SO Android estableciendo una relación de aspecto máxima. Recomendamos una relación de aspecto de 2.4 (12:5). Tu app tendrá formato letterbox cuando se ejecute en un dispositivo con una relación de aspecto mayor que la que especifiques. El valor que elijas debe ser al menos 1.0 para dispositivos Wear OS y al menos 1.33 para otros dispositivos. Si especificas una relación menor que estos límites, el sistema limitará la relación de aspecto de tu app según el nivel del SO, como se describió anteriormente.

Para establecer la relación de aspecto máxima para Android 8.0 (nivel de API 26) y versiones posteriores, declara la relación máxima usando android:maxAspectRatio en tu etiqueta <activity>. En el siguiente ejemplo, se muestra cómo declarar una relación de aspecto 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>

En el caso de Android 7.1 y versiones anteriores, agrega un elemento <meta-data> llamado android.max_aspect en el elemento <application> de la siguiente manera:

<!-- 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" />

Si configuras una relación de aspecto máxima, no olvides establecer también android:resizeableActivity false. De lo contrario, la relación de aspecto máxima no tendrá efecto.

Declara un tamaño máximo de pantalla

Incluso si no optimizas por completo tu app para que admita diferentes tamaños de pantalla, Android puede expandir la mayoría de las apps para que se ajusten a pantallas más grandes. Por lo tanto, casi nunca es necesario declarar un tamaño máximo de pantalla.

Si decides crear varios APK para diferentes tamaños de pantalla, no es necesario limitar un APK solo a pantallas pequeñas, ya que el APK optimizado para pantallas grandes debe tener el versionCode más grande, de modo que Google Play siempre entrega ese APK a los dispositivos con pantalla grande.

Sin embargo, si aún no estás conforme con la forma en que Android cambia el tamaño de tu app para pantallas grandes, puedes inhabilitar el cambio de tamaño más allá de un ancho determinado especificando el atributo largestWidthLimitDp en la etiqueta del manifiesto <supports-screens>. Luego, en lugar de cambiar el tamaño de tu diseño, Android habilita el modo de compatibilidad de pantalla, que dibuja tu diseño como lo haría en el tamaño más grande que admita tu app y, luego, escala todos los píxeles para llenar la pantalla.

Restringe tu app solo para tablets o televisores

Para evitar que los teléfonos celulares descarguen tu app, puedes usar el elemento de manifiesto <supports-screens>.

Por ejemplo, a continuación, se declara que solo se debe instalar tu app para pantallas grandes y extragrandes:

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

Restringe tu app solo para tamaños y densidades específicos

Puedes definir los tamaños y las densidades de pantalla exactos que admite tu app mediante el elemento de manifiesto <compatible-screens>. Sin embargo, te recomendamos que evites usar esta función, ya que cualquier combinación de tamaño y densidad que no especifiques se considera una configuración de la pantalla con la que tu app no es compatible. Por lo tanto, usar este elemento facilita el bloqueo de tu app en muchos dispositivos con los que es compatible.

El elemento <compatible-screens> debe contener uno o más elementos <screen>. Cada elemento <screen> especifica una configuración de pantalla con la que tu app es compatible, mediante los atributos android:screenSize y android:screenDensity. Cada elemento <screen> debe incluir ambos atributos para especificar una configuración de pantalla individual. Si falta alguno, el elemento no es válido (los servicios externos como Google Play lo ignorarán).

A continuación, se muestra cómo se ve la entrada de manifiesto si tu app es compatible solo con tamaños de pantalla pequeños y normales (y un subconjunto de densidades de pantalla):

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

Cualquier combinación de tamaño y densidad que no se declare explícitamente aquí no podrá instalar la app.