Declarar compatibilidad restringida con pantallas

Si bien recomendamos que diseñes tu app de modo que se adapte a cualquier tamaño y densidad de pantalla, quizá no quieras que admita determinadas configuraciones. Si este es el caso, puedes limitar la medida en la que Android puede modificar el tamaño de tu app e incluso restringir los dispositivos en los que se pueda instalar, como se describe en esta página.

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

Publicar APK diferentes para pantallas diferentes

Si resulta poco razonable compilar un solo APK que admita todas las configuraciones de pantalla, Google Play te permite publicar varios APK para el mismo listado de apps. Puedes usar esta característica para proporcionar APK independientes, y que cada uno admita un conjunto diferente de configuraciones de pantalla (como se declara en el archivo de manifiesto) sin crear listados separados en Google Play Store.

Por ejemplo, si quieres publicar una versión de tu app para teléfono y una para tablet, pero no puedes hacer que un APK funcione para ambos tamaños de pantalla, puedes publicar dos APK para el mismo listado de apps. Según la configuración de pantalla de cada dispositivo, Google Play descargará el APK que coincida con cada tamaño de pantalla.

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

Declarar una relación de aspecto máxima

Para admitir tantos dispositivos como sean posibles, una app debe adaptar su diseño de manera dinámica a fin de garantizar que su contenido y sus controles estén visibles y bien organizados.

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

El modo multiventana está disponible para todas las apps que se ejecuten en Android 7.0 (nivel de API 24), o versiones posteriores, y apps que admitan la modificación de tamaño de forma predeterminada. También puedes configurar de forma explícita el atributo android:resizeableActivity true para una app entera o para actividades específicas.

Si no quieres que tu app o actividad se ejecute en el modo multiventana, configura android:resizeableActivity false. En ese caso, la app siempre aparecerá en la pantalla completa. El sistema controla este proceso, según el nivel de Android OS:

  • Si tu app apunta a Android 8.0 (nivel de API 26) o versiones posteriores, ocupará toda la pantalla, según su diseño.
  • Si tu app apunta 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 de pantalla ancha de 16:9, que deja parte de la pantalla sin usar.

Si el diseño de tu app no puede adaptarse a relaciones de aspecto grandes arbitrarias, puedes forzar explícitamente el formato de pantalla ancha en todos los niveles de Android OS; para ello, debes establecer una relación de aspecto máxima. Te recomendamos una relación de 2.4 (12:5). Tu app se mostrará en pantalla ancha cuando se ejecute en un dispositivo con una relación de aspecto mayor que la que especificaste. El valor que selecciones debe ser al menos 1.0 para dispositivos con Wear OS, y al menos 1.33 para otros dispositivos. Si especificas una relación inferior a esos límites, el sistema limita la relación de aspecto de tu app según el nivel de sistema operativo, como se describe más arriba.

Si quieres establecer una 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 la manera de 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>

Para Android 7.1 y versiones anteriores, agrega un elemento <meta-data> denominado 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 fijas una relación de aspecto máxima, no olvides fijar también android:resizeableActivity false. De lo contrario, la relación de aspecto máxima no tendrá efecto.

Declarar un tamaño de pantalla máximo

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

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

No obstante, si aún no estás satisfecho con la manera en la que Android modifica el tamaño de tu app para pantallas grandes, puedes inhabilitar la modificación de tamaño a un ancho determinado especificando el atributo largestWidthLimitDp en la etiqueta <supports-screens> del manifiesto. Luego, en lugar de modificar el tamaño de tu diseño, Android habilita el modo de compatibilidad de pantalla, que exhibe tu diseño como si se mostrara en el tamaño de pantalla más grande que tu app admite, y luego agranda todos los píxeles para cubrir la pantalla.

Restringir tu app a tablets y TV únicamente

Puedes evitar que tu app se descargue en teléfonos móviles usando el elemento de manifiesto <supports-screens>.

En el siguiente ejemplo, se declara que tu app solo se debe instalar para pantallas grandes y extragrandes:

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

Restringir tu app a densidades y tamaños específicos

Puedes definir las densidades y los tamaños de pantalla exactos que tu app admite usando el elemento de manifiesto <compatible-screens>. Te recomendamos evitar esto, ya que las combinaciones de tamaño y densidad que no especifiques se considerarán como configuraciones con las cuales tu app no es compatible. Por lo tanto, usar este elemento permite bloquear tu app en una gran cantidad de dispositivos con los que tu app es compatible.

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

Así es como se ve la entrada del manifiesto si tu app es compatible únicamente con pantallas pequeñas 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>

La app no se instalará en casos de combinaciones de tamaño y densidad que no se declaren explícitamente aquí.