Cómo declarar una compatibilidad de pantalla restringida

Aunque recomendamos que diseñes tu app para que se adapte a todos los tamaños y densidades de pantalla, es posible que no quieras que sea compatible con ciertas configuraciones de pantalla. Si es así, 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 lograr la compatibilidad con varias pantallas e implementarlas de la mejor manera posible.

Publica diferentes APK para distintas pantallas

En caso de que no te parezca razonable compilar un solo APK que se compatible con todas las configuraciones de pantalla, Google Play te permite publicar varios APK para la misma ficha de la app. Puedes usar esta función para proporcionar APK separados que sean compatibles con diferentes conjuntos 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.

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

Declara una relación de aspecto máxima

Para ofrecer compatibilidad con tantos dispositivos como sea posible, una app debe adaptar su diseño de forma dinámica a fin de garantizar que su contenido y sus controles sean visibles y estén bien organizados.

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

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

Si no quieres que tu app o tu actividad se ejecuten en el modo multiventana, configura android:resizeableActivity false. En este caso, la app siempre aparece en pantalla completa. El sistema controla cómo se hace esto en función del nivel del SO Android:

  • Si tu app está orientada a Android 8.0 (API nivel 26) o versiones posteriores, rellena toda la pantalla, de acuerdo con su diseño.
  • Si tu app está orientada a Android 7.1 (API nivel 25) o versiones anteriores, el sistema limita el tamaño de su interfaz a una ventana con una relación de aspecto de 16:9 (1.86 aproximadamente). Si la app se ejecuta en un dispositivo con una relación de aspecto de pantalla más grande, aparece en un letterbox (formato 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 configurando una relación de aspecto máxima. Recomendamos una relación de aspecto de 2.4 (12:5). Tu app tendrá el formato letterbox cuando se ejecute en un dispositivo con una relación de aspecto mayor que la que especifiques. El valor que selecciones debe ser al menos 1.0 para dispositivos Wear OS y al menos 1.33 para otros dispositivos. Si especificas una proporción menor que estos límites, el sistema restringe la relación de aspecto de tu app según el nivel del SO, como se describe anteriormente.

Para configurar la relación de aspecto máxima para Android 8.0 (API nivel 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 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 que también debes configurar android:resizeableActivity false. De lo contrario, la relación de aspecto máxima no tiene efecto.

Declara un tamaño máximo de pantalla

Incluso si no optimizas completamente tu app para que sea compatible con diferentes tamaños de pantalla, Android aún puede ampliar 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.

Y, si decides crear varios APK para diferentes tamaños de pantalla, no es necesario que limites un APK solo a pantallas pequeñas, ya que el APK optimizado para pantallas grandes debe tener el versionCode más grande a fin de que Google Play siempre proporcione ese APK a los dispositivos que tengan una pantalla grande.

Sin embargo, si todavía no estás satisfecho 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 determinado ancho especificando el atributo largestWidthLimitDp en la etiqueta de manifiesto <supports-screens>. Luego, en vez 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 compatible con tu app y, luego, escala todos los píxeles para rellenar la pantalla.

Restringe tu app solo para tablets o televisores

Puedes evitar que los dispositivos móviles descarguen tu app usando el elemento de manifiesto <supports-screens>.

Por ejemplo, a continuación, se indica que solo las pantallas grandes y extragrandes deben instalar tu app:

<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 densidades de pantalla exactos que son compatibles con tu app usando el elemento de manifiesto <compatible-screens>. Pero te recomendamos que evites usar esto porque cualquier combinación de tamaño y densidad que no especifiques se considera como una configuración de pantalla con la que tu app no es compatible. Por lo tanto, el uso de este elemento facilita el bloqueo de tu app de 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, para lo cual usa los atributos android:screenSize y android:screenDensity. Cada elemento <screen> debe incluir ambos atributos para especificar una configuración de pantalla individual; si faltase algún atributo, el elemento no será válido (los servicios externos como Google Play lo ignorarán).

Así luce la entrada del 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.