Android 10 (nivel de API 29) introduce varias funciones y cambios en el comportamiento para proteger mejor la privacidad del usuario. Estos cambios extienden la transparencia y el control que los usuarios tienen sobre sus datos y las capacidades que otorgan a las apps. Es posible que estas funciones impliquen que los comportamientos o datos específicos de los que dependa tu app se comporten de manera diferente en comparación con versiones anteriores de la plataforma. El impacto en tu app debería minimizarse si sigues las prácticas recomendadas actuales para administrar los datos del usuario.
En esta página, se incluye un resumen de cada cambio.
Cambios principales
En esta sección, se incluyen los cambios principales de Android 10 relacionados con la privacidad.
Acceso al almacenamiento externo específico del contenido multimedia y los archivos de la app
De forma predeterminada, a las apps que se orientan a Android 10 y versiones posteriores se les otorga acceso específico al almacenamiento externo o almacenamiento específico. Estas apps pueden ver los siguientes tipos de archivos dentro de un dispositivo de almacenamiento externo sin tener que solicitar permisos al usuario relacionados con el almacenamiento:
- Archivos en el directorio específico de la app, a los que se accede mediante
getExternalFilesDir()
. - Fotos, videos y clips de audio que la app creó desde el almacén de contenido multimedia
Para obtener más información sobre el almacenamiento específico y sobre cómo compartir archivos guardados en dispositivos de almacenamiento externo, acceder a ellos y modificarlos, consulta las guías para administrar archivos en el almacenamiento externo y acceder a archivos multimedia y modificarlos.
El acceso a la ubicación del dispositivo en segundo plano requiere permiso
Para admitir el control adicional que tienen los usuarios sobre el acceso de una app a la información de ubicación, en Android 10, se introduce el permiso ACCESS_BACKGROUND_LOCATION
.
A diferencia de los permisos ACCESS_FINE_LOCATION
y ACCESS_COARSE_LOCATION
, el permiso ACCESS_BACKGROUND_LOCATION
solo afecta el acceso de una app a la ubicación cuando se ejecuta en segundo plano. Se considera que una app accede a la ubicación en segundo plano siempre y cuando no se cumpla alguna de las siguientes condiciones:
- Se muestra una actividad que pertenece a otra app.
La app ejecuta un servicio en primer plano que declaró un tipo de servicio en primer plano de
location
.Si quieres declarar un tipo de servicio en primer plano para un servicio de tu app, debes configurar el
targetSdkVersion
ocompileSdkVersion
de tu app en29
o una versión posterior. Obtén más información sobre cómo los servicios en primer plano pueden continuar acciones iniciadas por el usuario que requieren acceso a la ubicación.
Si tu app crea y supervisa geovallas y se orienta a Android 10 (nivel de API 29) o versiones posteriores, debes declarar el permiso ACCESS_BACKGROUND_LOCATION
.
El acceso se otorga automáticamente cuando las apps se orientan a Android 9 o versiones anteriores
Si tu app se ejecuta en Android 10 o versiones posteriores, pero está orientada a Android 9 (nivel de API 28) o versiones anteriores, la plataforma se comportará de la siguiente manera:
- Si tu app declara un elemento
<uses-permission>
paraACCESS_FINE_LOCATION
oACCESS_COARSE_LOCATION
, el sistema agrega automáticamente un elemento<uses-permission>
paraACCESS_BACKGROUND_LOCATION
durante la instalación. - Si tu app solicita
ACCESS_FINE_LOCATION
oACCESS_COARSE_LOCATION
, el sistema automáticamente agregaACCESS_BACKGROUND_LOCATION
a la solicitud.
Acceso cuando el dispositivo se actualiza a Android 10
Si un usuario le otorga a tu app acceso a la ubicación del dispositivo (ACCESS_COARSE_LOCATION
o ACCESS_FINE_LOCATION
) y, luego, actualiza su dispositivo de Android 9 a Android 10, el sistema actualiza automáticamente el conjunto de permisos basados en la ubicación otorgados a tu app. El conjunto de permisos que recibe tu app después de la actualización depende de la versión del SDK de destino y de sus permisos definidos, como se muestra en la siguiente tabla:
Versión de la plataforma de destino | ¿Se otorgó el permiso de ubicación precisa o general? |
¿Se definió el permiso en segundo plano en el manifiesto? |
Estado actualizado del permiso predeterminado |
---|---|---|---|
Android 10 | Sí | Sí | Acceso en primer y segundo plano |
Android 10 | Sí | No | Acceso en primer plano únicamente |
Android 10 | No | (Ignorado por el sistema) | Sin acceso |
Android 9 o anterior | Sí | Agregado automáticamente por el sistema durante la actualización del dispositivo | Acceso en primer y segundo plano |
Android 9 o anterior | No | (Ignorado por el sistema) | Sin acceso |
Ten en cuenta que el usuario puede cambiar este nivel de acceso incluso después de que el sistema actualice automáticamente el acceso de tu app a la ubicación del dispositivo. Por ejemplo, el usuario puede reducir el acceso de tu app a primer plano únicamente o revocarlo por completo. Antes de intentar acceder a la ubicación del dispositivo, en especial dentro de un servicio en primer plano, tu app debería verificar si el usuario aún le permite recibir la información de ubicación.
Se revocó el acceso cuando se actualizó el nivel de API objetivo en dispositivos Android 10.
Considera el caso en el que tu app ya está instalada en un dispositivo que ejecuta Android 10. Si actualizas tu app para que se oriente a Android 10 en esta situación, el dispositivo revocará el permiso ACCESS_BACKGROUND_LOCATION
.
Para obtener más información sobre cómo obtener la ubicación del dispositivo cuando tu app está en segundo plano, consulta la guía sobre cómo recibir actualizaciones de ubicación periódicas.
Restricciones sobre el inicio de actividades en segundo plano
A partir de Android 10, el sistema impone restricciones sobre el inicio de actividades en segundo plano. Este cambio de comportamiento ayuda a minimizar las interrupciones para el usuario y a darle más control de lo que aparece en la pantalla. Siempre que tu app inicie actividades como resultado directo de la interacción del usuario, es muy probable que no se vea afectada por estas restricciones.
Para obtener más información sobre la alternativa recomendada para iniciar actividades en segundo plano, consulta la guía sobre cómo alertar a los usuarios de eventos urgentes en tu app.
Identificadores y datos
En esta sección, se enumeran los cambios específicos para trabajar con identificadores y datos del dispositivo.
Eliminación de la afinidad de contactos
A partir de Android 10, la plataforma no realiza un seguimiento de la información de afinidad de contactos. Como resultado, si tu app realiza una búsqueda en los contactos del usuario, los resultados no estarán ordenados por frecuencia de interacción.
En la guía sobre ContactsProvider
, se incluye un aviso que describe los campos y métodos específicos que quedan obsoletos en todos los dispositivos a partir de Android 10.
Aleatorización de direcciones MAC
En los dispositivos que ejecutan Android 10 o versiones posteriores, el sistema transmite direcciones MAC aleatorias de manera predeterminada.
Si tu app administra un caso de uso empresarial, la plataforma proporciona las APIs para varias operaciones relacionadas con direcciones MAC:
- Obtén direcciones MAC aleatorias: Las apps de propietarios de dispositivos y perfiles pueden recuperar las direcciones MAC aleatorias asignadas a una red específica mediante una llamada a
getRandomizedMacAddress()
. - Obtén direcciones MAC de fábrica reales: Las apps para propietarios de dispositivos pueden recuperar la dirección MAC real del hardware del dispositivo mediante una llamada a
getWifiMacAddress()
. Este método es útil para realizar un seguimiento de varios dispositivos.
Restricciones sobre el acceso al sistema de archivos /proc/net
En dispositivos que ejecutan Android 10 o versiones posteriores, las apps no pueden acceder a /proc/net
, que incluye información sobre el estado de red de un dispositivo. Las apps que necesitan acceso a esta información, como las VPN, deben usar las clases NetworkStatsManager
o ConnectivityManager
.
Restricciones sobre identificadores de dispositivos que no se pueden restablecer
A partir de Android 10, las apps deben tener el permiso de firma READ_PRIVILEGED_PHONE_STATE
para acceder a los identificadores que no se pueden restablecer del dispositivo, incluido el IMEI y el número de serie.
Entre los métodos afectados, se incluyen los siguientes:
Build
TelephonyManager
Si tu app no tiene el permiso y solicitas información sobre los identificadores que no se pueden restablecer, la respuesta de la plataforma variará en función de la versión del SDK de destino:
- Si tu app se orienta a Android 10 o versiones posteriores, se genera una
SecurityException
. - Si tu app se orienta a Android 9 (nivel de API 28) o versiones anteriores, el método muestra
null
o datos del marcador de posición si la app tiene el permisoREAD_PHONE_STATE
. De lo contrario, se produce unSecurityException
.
Muchos casos prácticos no necesitan identificadores de dispositivo que no se pueden restablecer. Por ejemplo, si tu app usa identificadores de dispositivos que no se pueden restablecer para el seguimiento de anuncios o el análisis de usuarios, puedes usar un ID de publicidad de Android en esos casos prácticos específicos. Si quieres obtener más información, consulta las prácticas recomendadas para identificadores únicos.
Acceso limitado a los datos del portapapeles
A menos que tu app sea el editor de método de entrada (IME) predeterminado o esté enfocada, no podrá acceder a los datos del portapapeles en Android 10 o versiones posteriores.
Protección del número de serie de dispositivos USB
Si tu app se orienta a Android 10 o versiones posteriores, no podrá leer el número de serie hasta que el usuario otorgue el permiso de app al accesorio o dispositivo USB.
Si quieres obtener más información para trabajar con dispositivos USB, consulta la guía sobre cómo configurar hosts USB.
Cámara y conectividad
En esta sección, se enumeran los cambios específicos de los metadatos de la cámara y las API de conectividad.
Restricciones sobre el acceso a los metadatos y detalles de la cámara
Android 10 modifica la cantidad de información que el método getCameraCharacteristics()
muestra de forma predeterminada. En particular, tu app debe tener el permiso CAMERA
para acceder a los metadatos potencialmente específicos de un dispositivo que se incluye en el valor que muestra ese método.
Para obtener más información sobre estos cambios, consulta la sección sobre los campos de la cámara que requieren permiso.
Restricciones sobre la habilitación e inhabilitación de Wi-Fi
Las apps orientadas a Android 10 o versiones posteriores no pueden habilitar ni inhabilitar el Wi-Fi. El método WifiManager.setWifiEnabled()
siempre muestra false
.
Si necesitas solicitar al usuario que habilite o inhabilite la red Wi-Fi, usa el panel de configuración.
Restricciones sobre el acceso directo a redes Wi-Fi configuradas
Para proteger la privacidad del usuario, la configuración manual de la lista de redes Wi-Fi se restringe a apps del sistema y controladores de políticas de dispositivos (DCP). Un DPC específico puede ser el propietario del dispositivo o el del perfil.
Si tu app se orienta a Android 10 o una versión posterior, y no es una app del sistema o un DPC, entonces los siguientes métodos no mostrarán datos útiles:
El método
getConfiguredNetworks()
siempre muestra una lista vacía.Todos los métodos de la operación de red que muestran un valor entero (
addNetwork()
yupdateNetwork()
) mostrarán siempre -1.Cada operación de red que muestra un valor booleano (
removeNetwork()
,reassociate()
,enableNetwork()
,disableNetwork()
,reconnect()
ydisconnect()
) siempre muestrafalse
.
Si tu app necesita conectarse a redes Wi-Fi, usa los siguientes métodos alternativos:
- Para activar una conexión local instantánea a una red Wi-Fi, usa
WifiNetworkSpecifier
en un objetoNetworkRequest
estándar. - Si quieres agregar redes Wi-Fi para proporcionarle acceso a Internet al usuario, trabaja con objetos
WifiNetworkSuggestion
. Puedes agregar y quitar redes que aparecen en el diálogo de selección de redes de conexión automática llamando aaddNetworkSuggestions()
yremoveNetworkSuggestions()
, respectivamente. Estos métodos no necesitan ningún permiso de ubicación.
Algunas API de telefonía, Bluetooth y Wi-Fi requieren el permiso de ubicación precisa
Si tu app se orienta a Android 10 o versiones posteriores, debe tener el permiso ACCESS_FINE_LOCATION
para poder usar varios métodos dentro de las APIs de Wi-Fi, de reconocimiento de Wi-Fi y de Bluetooth. En las siguientes secciones, se enumeran las clases y los métodos afectados.
Telefonía
TelephonyManager
getCellLocation()
getAllCellInfo()
requestNetworkScan()
requestCellInfoUpdate()
getAvailableNetworks()
getServiceState()
TelephonyScanManager
requestNetworkScan()
TelephonyScanManager.NetworkScanCallback
onResults()
PhoneStateListener
onCellLocationChanged()
onCellInfoChanged()
onServiceStateChanged()
Wi-Fi
WifiManager
startScan()
getScanResults()
getConnectionInfo()
getConfiguredNetworks()
WifiAwareManager
WifiP2pManager
WifiRttManager
Bluetooth
BluetoothAdapter
startDiscovery()
startLeScan()
BluetoothAdapter.LeScanCallback
BluetoothLeScanner
startScan()
Permisos
En esta sección, se describen las actualizaciones al modelo de permisos de Android.
Acceso restringido a contenido de la pantalla
Con el objetivo de proteger el contenido de la pantalla de los usuarios contra el acceso silencioso, Android 10 cambia el alcance que tienen los permisos READ_FRAME_BUFFER
, CAPTURE_VIDEO_OUTPUT
y CAPTURE_SECURE_VIDEO_OUTPUT
. A partir de Android 10, solo se puede acceder a estos permisos mediante una firma.
Aquellas apps que necesiten acceder al contenido de la pantalla del dispositivo deberán usar la API de MediaProjection
, que solicita al usuario la aprobación del acceso.
Apps heredadas con verificación de permiso realizada por el usuario
Si tu app se orienta a Android 5.1 (nivel de API 22) o versiones anteriores, los usuarios pueden ver una pantalla de permisos cuando usan tu app en un dispositivo que ejecuta Android 10 o versiones posteriores por primera vez, como se muestra en la Figura 1. Esta pantalla les brinda a los usuarios la oportunidad de revocar el acceso a los permisos que el sistema otorgó a la app cuando se instaló.
Reconocimiento de actividad física
En Android 10, se introduce el permiso en tiempo de ejecución android.permission.ACTIVITY_RECOGNITION
para apps que necesitan detectar el recuento de pasos del usuario o clasificar su actividad física, como cuando camina, anda en bicicleta o está en un vehículo. Está diseñado para darles a los usuarios mayor visibilidad sobre cómo se usan los datos del sensor del dispositivo en Configuración.
Algunas bibliotecas dentro de los servicios de Google Play, como la API de reconocimiento de actividad y la API de Google Fit, no proporcionan resultados, a menos que el usuario haya otorgado este permiso.
Los únicos sensores incorporados en el dispositivo que requieren que declares este permiso son el contador de pasos y el detector de pasos.
Si tu app se orienta a Android 9 (nivel de API 28) o versiones anteriores, el sistema otorga automáticamente el permiso android.permission.ACTIVITY_RECOGNITION
a tu app, según sea necesario, si tu app cumple con cada una de las siguientes condiciones:
- El archivo de manifiesto incluye el permiso
com.google.android.gms.permission.ACTIVITY_RECOGNITION
. - El archivo de manifiesto no incluye el permiso
android.permission.ACTIVITY_RECOGNITION
.
Si el sistema otorga automáticamente el permiso android.permission.ACTIVITY_RECOGNITION
, tu app retendrá el permiso después de que la actualices para que se oriente a Android 10. Sin embargo, el usuario puede revocarlo en cualquier momento desde la configuración del sistema.
Se quitaron los grupos de permisos de la IU
A partir de Android 10, las apps no pueden ver cómo se agrupan los permisos en la IU.