Solicitar el consentimiento de los usuarios europeos

Según lo estipulado en la Política de Consentimiento de Usuarios de la Unión Europea de Google, debes mostrar cierta información a los usuarios que se encuentren en el Espacio Económico Europeo (EEE) y obtener su consentimiento para usar cookies u otros métodos de almacenamiento local en aquellos casos en los que sea obligatorio por ley, así como para usar sus datos personales (como AdID) con el objetivo de servirles anuncios. Esta política refleja los requisitos de la directiva sobre la privacidad electrónica de la UE y del Reglamento General de Protección de Datos (RGPD).

Para que los editores puedan cumplir fácilmente las disposiciones de esta política, Google proporciona un SDK de consentimiento. Se trata de una biblioteca de código abierto que ofrece funciones para obtener el consentimiento de los usuarios. El código fuente completo está disponible en GitHub.

Los anuncios que sirve Google se pueden clasificar como personalizados o no personalizados, y en ambos casos se requiere el consentimiento de los usuarios del EEE. De forma predeterminada, cuando se envían solicitudes de anuncio a Google, se sirven anuncios personalizados que se seleccionan en función de los datos de usuario que se hayan recogido con anterioridad. Google también permite configurar las solicitudes de anuncio para que se sirvan anuncios no personalizados. Más información sobre los anuncios personalizados y no personalizados

En esta guía se explica cómo usar el SDK de consentimiento para obtener el consentimiento de los usuarios. También se proporciona información sobre cómo reenviar el consentimiento al SDK de anuncios de Google para móviles cuando lo hayas obtenido.

Requisitos previos

Las aplicaciones pueden importar el SDK de consentimiento con una dependencia de Gradle que dirija al repositorio Maven de Google. Para usar este repositorio, debes hacer referencia a él en el archivo build.gradle a nivel de proyecto de la aplicación. Abre la tuya y busca la sección allprojects:

Ejemplo de build.gradle a nivel de proyecto (fragmento)

allprojects {
    repositories {
        google()
        jcenter()
    }
}

Añade la directiva google() anterior si no está ya.

A continuación, abre el archivo build.gradle de tu aplicación y busca la sección "dependencies" (dependencias).

Ejemplo de build.gradle a nivel de aplicación (fragmento)

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.android.ads.consent:consent-library:1.0.6'
}

Añade la línea que aparece en negrita más arriba, que indica a Gradle que obtenga la última versión del SDK de consentimiento. Una vez hecho esto, guarda el archivo y sincroniza Gradle.

Antes de usar cualquier otro método en el SDK de consentimiento, debes actualizar el estado del consentimiento para asegurarte de que el SDK dispone de la información más reciente sobre los proveedores de tecnología publicitaria que has seleccionado en la interfaz de usuario de AdMob. Si la lista de proveedores ha cambiado desde que el usuario dio su consentimiento por última vez, el estado del consentimiento vuelve a ser desconocido.

Si no usas la mediación

Si no usas la mediación, tienes dos opciones para obtener el consentimiento usando este SDK.

Una opción consiste en usar el SDK de consentimiento para presentar un formulario de consentimiento renderizado por Google a los usuarios. El formulario de consentimiento muestra una lista con los proveedores de tecnología publicitaria que has seleccionado en la interfaz de AdMob. Con esta opción, el SDK de consentimiento almacenará la respuesta del usuario.

La otra opción es utilizar el SDK de consentimiento para generar de forma dinámica la lista completa de proveedores de tecnología publicitaria a partir de los datos de AdMob, tal y como se explica en la sección Obtención de consentimiento gestionada por el editor. En este caso, tendrás que elegir cómo poner la lista de proveedores a disposición de los usuarios y presentarles tu propio formulario de consentimiento.

Cuando el usuario tome una decisión sobre el consentimiento, puedes pedir al SDK que la almacene, tal y como se explica en la sección Almacenar los consentimientos gestionados por el editor.

Si un usuario solo da su consentimiento para recibir anuncios no personalizados, tendrás que reenviárselo al SDK de anuncios de Google para móviles.

Si usas la mediación de AdMob

Puedes usar el SDK de consentimiento para generar de forma dinámica la lista completa de proveedores de tecnología publicitaria a partir de los datos de AdMob, tal y como se explica en la sección Obtención de consentimiento gestionada por el editor. Tendrás que determinar qué proveedores de tecnología publicitaria adicionales de otras redes debes presentar a tus usuarios a la hora de solicitarles su consentimiento.

Los desarrolladores de aplicaciones tienen que obtener el consentimiento de los usuarios tanto para los proveedores de tecnología publicitaria indicados por el SDK de consentimiento como para los de otras redes publicitarias. También debes almacenar manualmente las respuestas a la solicitud de consentimiento de los usuarios y, si el usuario solo ha aceptado recibir anuncios no personalizados, reenviar el consentimiento al SDK de anuncios de Google para móviles.

Por el momento, Google no puede obtener ni gestionar los consentimientos de las redes de mediación, por lo que tendrás que hacerlo por separado con cada red publicitaria. Estamos colaborando estrechamente con todas nuestras redes de mediación de código abierto y con varias versiones para ofrecer documentación actualizada sobre cómo reenviar los consentimientos. Las siguientes redes de mediación ya cuentan con esta documentación:

Actualizar el estado del consentimiento

Si utilizas el SDK de consentimiento, te recomendamos que determines el estado del consentimiento del usuario cada vez que abra la aplicación. Para ello, llama a requestConsentInfoUpdate() en una instancia de ConsentInformation.

import com.google.ads.consent.*;

public class MainActivity extends Activity {
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        ConsentInformation consentInformation = ConsentInformation.getInstance(context);
        String[] publisherIds = {"pub-0123456789012345"};
        consentInformation.requestConsentInfoUpdate(publisherIds, new ConsentInfoUpdateListener() {
            @Override
            public void onConsentInfoUpdated(ConsentStatus consentStatus) {
                 // User's consent status successfully updated.
            }

            @Override
            public void onFailedToUpdateConsentInfo(String errorDescription) {
                 // User's consent status failed to update.
            }
        });
        ...
    }
    ...
}

La llamada a requestConsentInfoUpdate() requiere dos argumentos:

  • Una matriz de IDs de editor válidos y completamente activados a los que tu aplicación solicite anuncios. Localizar el ID de editor

  • Una instancia de ConsentInfoUpdateListener.

Si la información de consentimiento se actualiza correctamente, se proporciona el estado actualizado del consentimiento mediante el método onConsentInfoUpdated() de ConsentInfoUpdateListener. ConsentStatus puede devolver los siguientes valores:

Estado del consentimiento Definición
ConsentStatus.PERSONALIZED El usuario ha dado su consentimiento para que se le muestren anuncios personalizados.
ConsentStatus.NON_PERSONALIZED El usuario ha dado su consentimiento para que se le muestren anuncios no personalizados.
ConsentStatus.UNKNOWN El usuario no ha dado ni denegado su consentimiento para que se le muestren anuncios personalizados o no personalizados.

Cuando la información de consentimiento se haya actualizado, también podrás usar el método ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown() para comprobar si el usuario se encuentra en el Espacio Económico Europeo o si la ubicación de la solicitud es desconocida.

Si el método isRequestLocationInEeaOrUnknown() devuelve false, significa que el usuario no se encuentra en el Espacio Económico Europeo y no se requiere su consentimiento para cumplir la Política de Consentimiento de Usuarios de la Unión Europea. Por lo tanto, puedes solicitar anuncios al SDK de anuncios de Google para móviles.

Si el método isRequestLocationInEeaOrUnknown() devuelve true:

  • Si el valor de ConsentStatus devuelto es PERSONALIZED o NON_PERSONALIZED, significa que el usuario ya ha dado su consentimiento, por lo que puedes reenviárselo al SDK de anuncios de Google para móviles.

  • Si el valor de ConsentStatus devuelto es UNKNOWN, consulta la sección Obtener el consentimiento más abajo, en la que se explica cómo usar los métodos de utilidades para obtener el consentimiento.

El SDK de consentimiento de Google El ofrece dos formas de recopilar el consentimiento de un usuario:

Recuerda que debes ofrecer a los usuarios la opción de cambiar o revocar el consentimiento.

El formulario de consentimiento renderizado por Google es un formulario configurable a pantalla completa que se muestra sobre el contenido de tu aplicación. Puedes configurarlo para ofrecer al usuario distintas combinaciones de las siguientes opciones:

  • Dar su consentimiento para ver anuncios personalizados.
  • Dar su consentimiento para ver anuncios no personalizados.
  • Usar una versión de pago de la aplicación en lugar de ver anuncios.

Revisa detenidamente el mensaje de consentimiento: el texto que aparece de forma predeterminada puede resultar adecuado si usas Google para monetizar tu aplicación, pero no podemos ofrecerte asesoramiento legal para determinar cuál es el que mejor se adapta a tu caso. Para cambiar el mensaje de consentimiento del formulario renderizado por Google, modifica el archivo consentform.html incluido en el SDK de consentimiento según sea necesario.

El formulario de consentimiento renderizado por Google se configura y se muestra mediante la clase ConsentForm. En el siguiente fragmento de código, puedes ver cómo crear un elemento ConsentForm que incluya las tres opciones de consentimiento:

URL privacyUrl = null;
try {
    // TODO: Replace with your app's privacy policy URL.
    privacyUrl = new URL("https://www.your.com/privacyurl");
} catch (MalformedURLException e) {
    e.printStackTrace();
    // Handle error.
}
ConsentForm form = new ConsentForm.Builder(context, privacyUrl)
    .withListener(new ConsentFormListener() {
        @Override
        public void onConsentFormLoaded() {
            // Consent form loaded successfully.
        }

        @Override
        public void onConsentFormOpened() {
            // Consent form was displayed.
        }

        @Override
        public void onConsentFormClosed(
                ConsentStatus consentStatus, Boolean userPrefersAdFree) {
            // Consent form was closed.
        }

        @Override
        public void onConsentFormError(String errorDescription) {
            // Consent form error.
        }
    })
    .withPersonalizedAdsOption()
    .withNonPersonalizedAdsOption()
    .withAdFreeOption()
    .build();

Los métodos anteriores preparan el formulario de consentimiento renderizado por Google con las siguientes opciones:

withListener()
Registra un procesador para ConsentForm. Cada uno de los métodos anulables de ConsentFormListener se corresponde con un evento del ciclo de vida del formulario de consentimiento.
Métodos anulables
onConsentFormLoaded El formulario de consentimiento se ha cargado.
onConsentFormError El formulario de consentimiento no se ha podido cargar. El parámetro errorDescription ofrece una descripción del error.
onConsentFormOpened El formulario de consentimiento se ha abierto.
onConsentFormClosed El formulario de consentimiento se ha cerrado. Los parámetros del método proporcionan la siguiente información:
  • El valor consentStatus de ConsentStatus indica el estado actualizado del consentimiento del usuario.
  • userPrefersAdFree tiene un valor true cuando el usuario decide usar una versión de pago de la aplicación en lugar de ver anuncios.
withPersonalizedAdsOption()
Indica que el formulario de consentimiento debe mostrar una opción de anuncio personalizado.
withNonPersonalizedAdsOption()
Indica que el formulario de consentimiento debe mostrar una opción de anuncio no personalizado.
withAdFreeOption()
Indica que el formulario de consentimiento debe mostrar una opción de aplicación sin anuncios.

Después de crear un objeto ConsentForm, invoca el método load() de ConsentForm para cargar el formulario de consentimiento, tal y como se muestra a continuación:

form.load();

Para mostrar al usuario el formulario de consentimiento renderizado por Google, llama a show() en una instancia de ConsentForm, tal y como se muestra a continuación:

form.show();

Cuando el usuario selecciona una opción y cierra el formulario, el SDK de consentimiento guarda su elección y activa el evento onConsentFormClosed. Puedes procesar este evento y reenviar el consentimiento al SDK de anuncios de Google para móviles.

Obtención de consentimiento gestionada por el editor

Si decides obtener el consentimiento por tu cuenta, puedes usar el método getAdProviders() de la clase ConsentInformation para obtener los proveedores de tecnología publicitaria asociados a los ID de editor que se usan en tu aplicación. Es necesario que se consienta el uso de todos los proveedores de tecnología publicitaria que has configurado para tus ID de editor.

Para poder llamar a getAdProviders(), debes esperar al método onConsentInfoUpdate() de ConsentInfoUpdateListener, tal y como se describe en la sección Actualizar el estado del consentimiento.

List<AdProvider> adProviders =
    ConsentInformation.getInstance(context).getAdProviders();

A continuación, podrás usar la lista de proveedores de tecnología publicitaria para obtener el consentimiento por tu cuenta.

Cuando obtengas el consentimiento, registra el elemento ConsentStatus correspondiente a la respuesta del usuario mediante el método setConsentStatus() de la clase ConsentInformation.

ConsentInformation.getInstance(context)
    .setConsentStatus(ConsentStatus.PERSONALIZED);

Tras comunicar el consentimiento al SDK, puedes reenviárselo al SDK de anuncios de Google para móviles.

Para ello, solo tienes que repetir los pasos indicados en la sección Obtener el consentimiento cuando el usuario cambie su estado de consentimiento.

Si el editor sabe que el usuario no tiene la edad para dar su consentimiento legal, se debe incluir en todas las solicitudes de anuncios el parámetro TFUA (etiqueta para indicar que los usuarios no tienen edad para dar su consentimiento legal en Europa). Para incluir esta etiqueta en todas las solicitudes de anuncios realizadas desde tu aplicación, llama a setTagForUnderAgeOfConsent(true). Este ajuste se aplicará a todas las solicitudes de anuncios posteriores.

ConsentInformation.getInstance(context).setTagForUnderAgeOfConsent(true);

Si habilitas el parámetro TFUA, el formulario de consentimiento renderizado por Google no podrá cargarse. Todas las solicitudes de anuncios que incluyan esta etiqueta dejarán de ser aptas para mostrar anuncios personalizados y para el remarketing. El parámetro TFUA inhabilita las solicitudes a proveedores de tecnología publicitaria de terceros, como píxeles de medición de anuncios y servidores de anuncios de terceros.

Para eliminar el parámetro TFUA de las solicitudes de anuncios, llama a setTagForUnderAgeOfConsent(false).

Pruebas

El comportamiento del SDK de consentimiento varía en función del valor de ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown(). Por ejemplo, el formulario de consentimiento no se carga si el usuario no se encuentra en el EEE.

Para que sea más fácil probar la aplicación dentro y fuera del EEE, el SDK de consentimiento admite las opciones de depuración, que puedes configurar antes de llamar a otros métodos en el SDK de consentimiento.

  1. Sigue las instrucciones de la sección Actualizar el estado del consentimiento para llamar a requestConsentInfoUpdate. A continuación, ejecuta la aplicación y comprueba el resultado de logcat del siguiente registro:

    I/ConsentInformation: Use
    ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231")
    to get test ads on this device.
  2. Designa tu dispositivo como dispositivo de prueba con el ID de publicidad de logcat:

    ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231");
  3. Por último, llama a setDebugGeography para configurar la ubicación geográfica que quieras usar en las pruebas.

    // Geography appears as in EEA for test devices.
    ConsentInformation.getInstance(context).
        setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA);
    // Geography appears as not in EEA for debug devices.
    ConsentInformation.getInstance(context).
        setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_NOT_EEA);

Cuando completes estos pasos, las llamadas para actualizar el estado del consentimiento tendrán en cuenta el área geográfica de depuración que hayas establecido.

El código de esta sección se puede usar con cualquier versión del SDK de anuncios de Google para móviles, tanto si has usado el SDK de consentimiento como si no.

El SDK de anuncios de Google para móviles sirve anuncios personalizados de forma predeterminada. Si un usuario solo da su consentimiento para recibir anuncios no personalizados, puedes configurar un objeto AdRequest para especificar que solo se soliciten anuncios no personalizados. El siguiente código hace que se soliciten anuncios no personalizados sin tener en cuenta si el usuario se encuentra en el EEE.

Bundle extras = new Bundle();
extras.putString("npa", "1");

AdRequest request = new AdRequest.Builder()
        .addNetworkExtrasBundle(AdMobAdapter.class, extras)
        .build();

Si se solicitan anuncios no personalizados, la URL de solicitud de anuncio incluye actualmente &npa=1, pero se trata de un ajuste de implementación interno del SDK de anuncios de Google para móviles que podría cambiar.

Retrasar la medición de la aplicación (opcional)

De forma predeterminada, el SDK de anuncios de Google para móviles inicializa la medición de la aplicación y empieza a enviar datos de eventos a nivel de usuario a Google justo después de que se inicie la aplicación. Gracias a este comportamiento, puedes habilitar las métricas de usuario de AdMob sin tener que hacer ningún cambio en el código.

Sin embargo, si tu aplicación requiere el consentimiento del usuario para poder enviar estos eventos, puedes retrasar la medición de la aplicación hasta que inicialices el SDK de anuncios para móviles expresamente o cargues un anuncio.

Para retrasar la medición de la aplicación, añade la siguiente etiqueta <meta-data> a tu archivo AndroidManifest.xml.

<manifest>
     <application>
        <!-- Delay app measurement until MobileAds.initialize() is called. -->
        <meta-data
            android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
            android:value="true"/>
    </application>
</manifest>

Preguntas frecuentes

¿Cuántos proveedores de tecnología publicitaria admite el SDK de consentimiento?
No hay ningún límite en el número de proveedores de tecnología publicitaria que puede habilitar el editor con el SDK de consentimiento.
¿La lista de proveedores de tecnología publicitaria que muestra el SDK se actualiza automáticamente si cambio mi selección en la interfaz de usuario de AdMob?
Así es. Si haces algún cambio en la lista de proveedores de tecnología publicitaria de la interfaz de usuario de AdMob, los cambios se propagarán a los servidores de anuncios de Google en una hora aproximadamente.