Cambios en el comportamiento: apps orientadas a Android 13 o versiones posteriores

Al igual que las versiones anteriores, Android 13 incluye cambios de comportamiento que podrían afectar tu app. Los siguientes cambios se aplican exclusivamente a las apps orientadas a Android 13 o versiones posteriores. Si tu app está orientada a Android 13 o versiones posteriores, debes modificarla para que admita estos comportamientos correctamente, cuando corresponda.

Asegúrate de revisar también la lista de cambios en el comportamiento que afectan a todas las apps que se ejecutan en Android 13.

Privacidad

El permiso de notificaciones afecta la apariencia de los servicios en primer plano

Si el usuario rechaza el permiso de notificaciones, no verá avisos relacionados con los servicios en primer plano en el panel lateral de notificaciones. Sin embargo, los usuarios aún ven esos avisos en el Administrador de tareas, sin importar si se otorga el permiso de notificaciones.

Nuevo permiso de tiempo de ejecución para dispositivos de Wi-Fi cercanos

En versiones anteriores de Android, el usuario debe otorgarle a tu app el ACCESS_FINE_LOCATION permiso para completar varios casos de uso frecuentes de Wi-Fi.

Como es difícil para los usuarios asociar permisos de ubicación con la funcionalidad de Wi-Fi, Android 13 (nivel de API 33) incorpora un permiso de tiempo de ejecución en el grupo de permisos NEARBY_DEVICES para apps que administran las conexiones de un dispositivo a puntos de acceso cercanos a través de Wi-Fi. Este permiso, NEARBY_WIFI_DEVICES, completa casos de uso de Wi-Fi como los siguientes:

  • Buscar dispositivos cercanos, como impresoras o dispositivos de transmisión de contenido multimedia, o conectarse a ellos. Este flujo de trabajo permite que tu app realice este tipo de tareas:
    • Recibir información del punto de acceso fuera de banda, por ejemplo, a través de BLE
    • Descubrir dispositivos y conectarse a ellos a través de Wi-Fi Aware y conectarse mediante un hotspot solo local
    • Descubrir dispositivos y conectarse a ellos a través de Wi-Fi directo
  • Iniciar una conexión a un SSID conocido, como un automóvil o un dispositivo de casa inteligente.
  • Iniciar un hotspot solo local.
  • Alcanzar dispositivos cercanos de Wi-Fi Aware

Siempre que tu app no obtenga información de la ubicación física de las APIs de Wi-Fi, solicita NEARBY_WIFI_DEVICES en lugar de ACCESS_FINE_LOCATION cuando orientes tu app a Android 13 o versiones posteriores y uses APIs de Wi-Fi. Cuando declaras el permiso NEARBY_WIFI_DEVICES, afirma con firmeza que tu app nunca obtiene información de la ubicación física de las APIs de Wi-Fi. Para hacerlo, configura el atributo android:usesPermissionFlags en neverForLocation. Este proceso es similar al que realizas en Android 12 (nivel de API 31) y versiones posteriores, cuando declaras que la información del dispositivo Bluetooth nunca se usa para la ubicación.

Obtén más información sobre cómo solicitar permiso para acceder a dispositivos Wi-Fi cercanos.

Permisos de contenido multimedia detallados

Los 2 botones del diálogo, de arriba abajo, son Permitir y No permitir
Figura 1. Diálogo de permisos del sistema que ve el usuario cuando solicitas el permiso READ_MEDIA_AUDIO.

Si tu app se orienta a Android 13 o versiones posteriores y necesita acceder a archivos multimedia que crearon otras apps, debes solicitar uno o más de los siguientes permisos de contenido multimedia detallados en lugar de el permiso READ_EXTERNAL_STORAGE:

Tipo de contenido multimedia Permiso para solicitar
Imágenes y fotos READ_MEDIA_IMAGES
Videos READ_MEDIA_VIDEO
Archivos de audio READ_MEDIA_AUDIO

Antes de acceder a los archivos multimedia de otra app, verifica que el usuario le haya otorgado a tu app los permisos de contenido multimedia detallados adecuados.

En la Figura 1, se muestra una app que solicita el permiso READ_MEDIA_AUDIO.

Si solicitas los permisos READ_MEDIA_IMAGES y READ_MEDIA_VIDEO al mismo tiempo, solo aparecerá un diálogo de permiso del sistema.

Si a tu app se le otorgó el permiso READ_EXTERNAL_STORAGE con anterioridad, se otorgarán automáticamente los permisos READ_MEDIA_* solicitados cuando se actualice. Puedes usar el siguiente comando de ADB para revisar los permisos actualizados:

adb shell cmd appops get --uid PACKAGE_NAME

El uso de sensores corporales en segundo plano requiere un permiso nuevo

Android 13 introduce el concepto de acceso "durante el uso" para los sensores corporales, como el ritmo cardíaco, la temperatura y el porcentaje de oxígeno en sangre. Este modelo de acceso es muy similar al que introdujo el sistema para la ubicación en Android 10 (nivel de API 29).

Si tu app se orienta a Android 13 y requiere acceso a la información del sensor corporal mientras se ejecuta en segundo plano, debes declarar el nuevo permiso BODY_SENSORS_BACKGROUND además del permiso existente BODY_SENSORS.

Rendimiento y batería

Uso de recursos de batería

Si el usuario coloca tu app en estado "restringido" para el uso de batería en segundo plano mientras la app se orienta a Android 13, el sistema no entrega la transmisión BOOT_COMPLETED ni LOCKED_BOOT_COMPLETED hasta que se inicie la app por otros motivos.

Experiencia del usuario

Controles multimedia derivados de PlaybackState

En el caso de las apps que se orientan a Android 13 (nivel de API 33) y versiones posteriores, el sistema obtiene controles multimedia de las acciones de PlaybackState. De esta manera, el sistema puede mostrar un conjunto de controles más completo que sea técnicamente coherente entre teléfonos y tablets, y también que se alinee con la forma en que se renderizan los controles multimedia en otras plataformas de Android, como Android Auto y Android TV.

En la Figura 2, se muestra un ejemplo de cómo se ve en un teléfono y una tablet, respectivamente.

Apariencia de los controles multimedia en teléfonos y tablets mediante un ejemplo de una pista de muestra que indica cómo pueden aparecer los botones
Figura 2: Controles multimedia en teléfonos y tablets

Antes de Android 13, el sistema mostraba hasta cinco acciones de la notificación de MediaStyle en el orden en que se agregaron. En el modo compacto, por ejemplo, en la configuración rápida contraída, se mostraron hasta tres acciones especificadas con setShowActionsInCompactView().

A partir de Android 13, el sistema muestra hasta cinco botones de acción en función de PlaybackState, como se describe en la siguiente tabla. En el modo compacto, solo se mostrarán las primeras tres ranuras de acción. En el caso de las apps que no se orientan a Android 13 o que no incluyen PlaybackState, el sistema mostrará los controles en función de la lista de Action que se agregó a la notificación de MediaStyle, como se describió en el párrafo anterior.

Ranura Acción Criterios
1 Reproducir El estado actual de PlaybackState es uno de los siguientes:
  • STATE_NONE
  • STATE_STOPPED
  • STATE_PAUSED
  • STATE_ERROR
Ícono giratorio de carga El estado actual de PlaybackState es uno de los siguientes:
  • STATE_CONNECTING
  • STATE_BUFFERING
Pausar El estado actual de PlaybackState no es ninguno de los anteriores.
2 Anterior Las acciones de PlaybackState incluyen ACTION_SKIP_TO_PREVIOUS.
Personalizada Las acciones de PlaybackState no incluyen ACTION_SKIP_TO_PREVIOUS, y las acciones personalizadas de PlaybackState incluyen una acción personalizada que todavía no se implementó.
Vacío Los extras de PlaybackState incluyen un valor booleano true para la clave SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_PREV.
3 Siguiente Las acciones de PlaybackState incluyen ACTION_SKIP_TO_NEXT.
Personalizada Las acciones de PlaybackState no incluyen ACTION_SKIP_TO_NEXT, y las acciones personalizadas de PlaybackState incluyen una acción personalizada que todavía no se implementó.
Vacío Los extras de PlaybackState incluyen un valor booleano true para la clave SESSION_EXTRAS_KEY_SLOT_RESERVATION_SKIP_TO_NEXT.
4 Personalizada Las acciones personalizadas de PlaybackState incluyen una acción personalizada que todavía no se realizó.
5 Personalizada Las acciones personalizadas de PlaybackState incluyen una acción personalizada que todavía no se realizó.

Las acciones personalizadas se muestran en el orden en que se agregaron a PlaybackState.

Tema de color de las apps aplicado automáticamente al contenido de WebView

En el caso de las apps orientadas a Android 13 (nivel de API 33) o versiones posteriores, el método setForceDark() es obsoleto, lo que genera una no-op si se llama al método.

En cambio, WebView ahora establece la consulta de medios prefers-color-scheme según el atributo del tema de la app, isLightTheme. En otras palabras, si isLightTheme es true o no se especifica, prefers-color-scheme es light; de lo contrario, es dark. Este comportamiento significa que el estilo oscuro o claro del contenido web se aplica automáticamente para que coincida con el tema de la app si el contenido lo admite.

Para la mayoría de las apps, el nuevo comportamiento debería aplicar automáticamente los estilos de app adecuados. Sin embargo, debes probar tu app para verificar si hay casos en los que hayas controlado en forma manual la configuración del modo oscuro.

Si aún necesitas personalizar el comportamiento del tema de color de tu app, usa el método setAlgorithmicDarkeningAllowed() como alternativa. A fin de brindar retrocompatibilidad con versiones de Android anteriores, te recomendamos usar el método setAlgorithmicDarkeningAllowed() equivalente en AndroidX.

Consulta la documentación sobre ese método para obtener más información sobre el comportamiento que se puede esperar en tu app según la targetSdkVersion y la configuración de tema.

Conectividad

BluetoothAdapter#enable() y BluetoothAdapter#disable() dejaron de estar disponibles

En el caso de las apps orientadas a Android 13 (nivel de API 33) o versiones posteriores, los métodos BluetoothAdapter#enable() y BluetoothAdapter#disable() son obsoletos y siempre devuelven false.

Los siguientes tipos de apps están exentos de estos cambios:

  • Apps del propietario del dispositivo
  • Apps del propietario del perfil
  • Apps del sistema

Servicios de Google Play

Se requiere permiso para el ID de publicidad

Las apps que usan el ID de publicidad de Servicios de Google Play y se orientan a Android 13 (nivel de API 33) y versiones posteriores deben declarar el permiso normal AD_ID en el archivo de manifiesto de la app, de la siguiente manera:

<manifest ...>
    <!-- Required only if your app targets Android 13 or higher. -->
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

    <application ...>
        ...
    </application>
</manifest>

Si tu app no declara este permiso cuando se orienta a Android 13 o versiones posteriores, se quita automáticamente el ID de publicidad y se reemplaza por una string de ceros.

Si tu app usa SDKs que declaran el permiso AD_ID en el manifiesto de la biblioteca, este se combinará con el archivo de manifiesto de tu app de forma predeterminada. En este caso, no necesitas declarar el permiso en el archivo de manifiesto de tu app.

Para obtener más información, consulta ID de publicidad en la Ayuda de Play Console.

Actualización de restricciones que no pertenecen al SDK

Android 13 incluye listas actualizadas de este tipo de interfaces que están basadas en la colaboración con desarrolladores de Android y las pruebas internas más recientes. Siempre que sea posible, nos aseguramos de que las alternativas públicas estén disponibles antes de restringir las interfaces que no pertenecen al SDK.

Si tu app no está orientada a Android 13, es posible que algunos de estos cambios no te afecten de inmediato. Sin embargo, aunque actualmente puedes usar algunas interfaces que no pertenecen al SDK (según el nivel de API objetivo al que esté orientada la app), utilizar cualquier método o campo que no pertenezca al SDK siempre implica un gran riesgo de error para la app.

En caso de no saber con certeza si tu app usa este tipo de interfaces, puedes probarla para verificarlo. Si tu app depende de interfaces que no pertenezcan al SDK, deberías planificar una migración hacia otras alternativas que sí lo hagan. Sin embargo, sabemos que algunas apps tienen casos prácticos válidos para usarlas. Si no encuentras una alternativa al uso de una interfaz que no pertenece al SDK para una función de tu app, deberías solicitar una nueva API pública.

Para obtener más información sobre los cambios implementados en esta versión de Android, consulta Actualizaciones de las restricciones de interfaces que no pertenecen al SDK en Android 13. Para obtener más información sobre las interfaces que no pertenecen al SDK en general, consulta Restricciones en interfaces que no pertenecen al SDK.