Cómo obtener un ID de publicidad que el usuario puede restablecer Parte de Android Jetpack.

Para proteger la privacidad del usuario, una práctica recomendada es hacer que todas las apps para Android trabajen con identificadores que el usuario puede restablecer. Un ejemplo de estos es un ID de publicidad, que identifica exclusivamente un usuario en particular en los casos prácticos de publicidad, como la personalización de anuncios.

Para admitir una solución de seguimiento de anuncios estandarizada en todos los dispositivos que ejecutan tu app, puedes usar la biblioteca de ID de publicidad. Esta biblioteca, que está disponible en los dispositivos que ejecutan Android 4.0 (nivel de API 14) y versiones posteriores, define una interfaz para interactuar con los proveedores de anuncios a nivel del sistema. Esta interfaz permite que tu app reciba valores de ID de publicidad coherentes.

El proveedor de anuncios que se incluye con la biblioteca de ID de publicidad también define un intent estándar para abrir una pantalla de configuración que implementa el proveedor de anuncios. Esta pantalla de configuración permite al usuario restablecer su ID de publicidad y, además, inhabilitar la personalización de anuncios.

En esta guía, se explica cómo usar el módulo cliente de la biblioteca de ID de publicidad para obtener un ID de publicidad coherente para cada usuario del dispositivo. Además, se presenta una descripción general de la arquitectura de la biblioteca.

Cómo configurar la app cliente

Al interactuar con el módulo cliente de la biblioteca de ID de publicidad, tu app puede recuperar un ID de publicidad coherente que represente al usuario que interactúa con la app.

El ID de publicidad se representa con la versión 3 del formato de identificador único universal (UUID) o un formato de 128 bits equivalente:

38400000-8cf0-11bd-b23e-10b96e40000d

La biblioteca de ID de publicidad normaliza el valor de retorno según sea necesario para proporcionar los IDs con este formato:

Si quieres obtener un ID de publicidad que el usuario puede restablecer para tu app, completa los siguientes pasos:

  1. Llama a AdvertisingIdClient.isAdvertisingIdProviderAvailable() para verificar si hay un proveedor de anuncios disponible. Si este método devuelve false, tu app debe usar otro medio para realizar cualquiera de los casos de uso de seguimiento de anuncios requeridos.

  2. Llama a AdvertisingIdClient.getAdvertisingIdInfo() para obtener los detalles del identificador de anuncios, incluido el ID de publicidad. La biblioteca de ID de publicidad ejecuta este método en un subproceso de trabajo y usa un tiempo de espera de conexión de 10 segundos.

En el siguiente fragmento de código, se muestra cómo recuperar el ID de publicidad junto con otra información del proveedor de anuncios:

app/build.gradle

Groovy

dependencies {
    implementation 'androidx.ads:ads-identifier:1.0.0-alpha01'

    // Used for the calls to addCallback() in the snippets on this page.
    implementation 'com.google.guava:guava:28.0-android'
}

Kotlin

dependencies {
    implementation("androidx.ads:ads-identifier:1.0.0-alpha01")

    // Used for the calls to addCallback() in the snippets on this page.
    implementation("com.google.guava:guava:28.0-android")
}

MyAdIdClient

Kotlin

// Used for the call to addCallback() within this snippet.
import com.google.common.util.concurrent.Futures.addCallback

private fun determineAdvertisingInfo() {
    if (AdvertisingIdClient.isAdvertisingIdProviderAvailable()) {
        val advertisingIdInfoListenableFuture =
                AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)

        addCallback(advertisingIdInfoListenableFuture,
                object : FutureCallback<AdvertisingIdInfo> {
            override fun onSuccess(adInfo: AdvertisingIdInfo?) {
                val id: String = adInfo?.id
                val providerPackageName: String = adInfo?.providerPackageName
                val isLimitTrackingEnabled: Boolean =
                                adInfo?.isLimitTrackingEnabled
            }

            // Any exceptions thrown by getAdvertisingIdInfo()
            // cause this method to be called.
            override fun onFailure(t: Throwable) {
                Log.e("MY_APP_TAG",
                        "Failed to connect to Advertising ID provider.")
                // Try to connect to the Advertising ID provider again or fall
                // back to an ad solution that doesn't require using the
                // Advertising ID library.
            }
        }, Executors.newSingleThreadExecutor())
    } else {
        // The Advertising ID client library is unavailable. Use a different
        // library to perform any required ad use cases.
    }
}

Java

// Used for the call to addCallback() within this snippet.
import com.google.common.util.concurrent.Futures;

private void determineAdvertisingInfo() {
    if (AdvertisingIdClient.isAdvertisingIdProviderAvailable()) {
        ListenableFuture<AdvertisingIdInfo> advertisingIdInfoListenableFuture =
                AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext());
        Futures.addCallback(advertisingIdInfoListenableFuture,
                new FutureCallback<AdvertisingIdInfo>() {
                    @Override
                    public void onSuccess(AdvertisingIdInfo adInfo) {
                        String id = adInfo.getId();
                        String providerPackageName =
                                adInfo.getProviderPackageName();
                        boolean isLimitTrackingEnabled =
                                adInfo.isLimitTrackingEnabled();

                    // Any exceptions thrown by getAdvertisingIdInfo()
                    // cause this method to be called.
                    @Override
                    public void onFailure(Throwable throwable) {
                        Log.e("MY_APP_TAG",
                                "Failed to connect to Advertising ID provider.");
                        // Try to connect to the Advertising ID provider again
                        // or fall back to an ad solution that doesn't require
                        // using the Advertising ID library.
                    }
                });
    } else {
        // The Advertising ID client library is unavailable. Use a different
        // library to perform any required ad use cases.
    }
}

Arquitectura de la biblioteca de ID de publicidad

Arquitectura de la biblioteca de ID de publicidad
Figura 1: Arquitectura de la biblioteca de ID de publicidad

En la figura 1, se muestra la estructura de la biblioteca de ID de publicidad. La biblioteca consta de los siguientes módulos:

  • Incluye un módulo cliente, que es una capa liviana incluida en las apps.
  • Incluye un módulo proveedor, que el fabricante del dispositivo pone a disposición del usuario. Las implementaciones de este módulo deben definir una IU de configuración para brindar a los usuarios la capacidad de restablecer su ID de publicidad y configurar las preferencias de seguimiento de anuncios.

El módulo cliente se comunica con el módulo proveedor para recuperar los IDs de publicidad y las preferencias del usuario relacionadas con el seguimiento de anuncios.

Cómo la biblioteca administra varios proveedores

Es posible que un dispositivo admita varios proveedores de anuncios en el nivel del sistema a la vez. Si la biblioteca de ID de publicidad detecta esta situación, verifica que tu app siempre obtenga información del mismo proveedor, asumiendo que el proveedor siga estando disponible. Este proceso asegura la coherencia del ID de publicidad.

Si el conjunto de proveedores de anuncios disponibles cambia con el tiempo y tu app interactúa con un proveedor de identificadores de anuncios diferente, todas las otras apps clientes también comenzarán a usar el nuevo proveedor. Tu app se comporta de la misma manera en que lo haría si el usuario hubiera solicitado el restablecimiento de su ID de publicidad.

La biblioteca de proveedores de ID de publicidad usa el siguiente orden determinístico para clasificar los proveedores:

  1. Son los proveedores que solicitaron el permiso androidx.ads.identifier.provider.HIGH_PRIORITY.
  2. Proveedores que estuvieron instalados en el dispositivo por más tiempo
  3. Proveedores que aparecen primeros en orden alfabético