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

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

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 notificación afecta la apariencia del servicio en primer plano

Si el usuario rechaza este permiso, aún podrá ver los avisos relacionados con estos servicios en primer plano en el Administrador de tareas de servicios en primer plano (FGS), pero no las verá en el panel lateral de notificaciones.

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

En versiones anteriores de Android, el usuario debe otorgarle el permiso ACCESS_FINE_LOCATION a tu app para que complete varios casos de uso frecuentes de Wi-Fi que se relacionan con los hotspots, las conexiones Wi-Fi directas, Wi-Fi RTT y mucho más.

Como es difícil para los usuarios asociar permisos de ubicación con la funcionalidad de Wi-Fi, Android 13 (nivel de API 33) introduce un nuevo 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 estos casos de uso de Wi-Fi.

Siempre que tu app no obtenga información de la ubicación física de las API 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 API de Wi-Fi. 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.

Más información sobre el permiso para dispositivos de 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 la app se orienta a Android 13, debes solicitar uno o más permisos nuevos en lugar de los permisos READ_EXTERNAL_STORAGE y WRITE_EXTERNAL_STORAGE.

El conjunto de permisos que solicites dependerá de los tipos de contenido multimedia a los que la app necesite acceder:

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

Si el usuario le otorgó anteriormente el permiso READ_EXTERNAL_STORAGE a tu app, el sistema le otorgará automáticamente cada uno de los nuevos permisos a esta.

De lo contrario, el sistema mostrará un diálogo para el usuario cuando la app solicite cualquiera de los permisos que se muestran en la tabla anterior. En la Figura 1, la app 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.

Pasos para la migración cuando te orientas a Android 13

Después de orientarte a Android 13, declara los permisos de contenido multimedia que necesita tu app. Para conservar la compatibilidad con versiones anteriores de Android, declara el permiso READ_EXTERNAL_STORAGE mientras configuras maxSdkVersion en 32, como se muestra en el siguiente fragmento de código:

<manifest ...>
    <!-- Required only if your app targets Android 13. -->
    <!-- Declare one or more the following permissions only if your app needs
    to access data that's protected by them. -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

    <!-- Required to maintain app compatibility. -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

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.

Seguridad

Los filtros de intents bloquean los intents que no coinciden

Cuando tu app envía un intent a un componente exportado de otra app orientada a Android 13 o versiones posteriores, se entrega ese intent solo si coincide con un elemento <intent-filter> en la app receptora. Los intents que no coinciden se bloquean.

Las excepciones en las que no se aplica de manera forzosa la coincidencia de intents son las siguientes:

  • Intents enviados a componentes que no declaran ningún filtro de intents.
  • Intents que se originan en la misma app.
  • Intents que se originan en el sistema es decir, los intents que se envían desde el "UID del sistema" (uid=1000). Las apps del sistema incluyen system_server y apps que configuran android:sharedUserId como android.uid.system.
  • Intents que se originan en la raíz.

Si una app receptora se actualiza a Android 13 o versiones posteriores, todos los intents que se originan en apps externas se entregan a un componente exportado solo si coincide con sus elementos <intent-filter> declarados, independientemente de la versión del SDK de destino de la app emisora.

Rendimiento y batería

Uso de recursos de batería

Si el usuario coloca la app en estado "restringido" para el uso de batería en segundo plano mientras tu app se orienta a Android 13, el sistema aplica varias limitaciones relacionadas con las transmisiones.

Obtén más información sobre las limitaciones nuevas para el uso restringido de batería en segundo plano en la página que describe las funciones de uso de recursos de batería que se introducen en Android 13.

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.