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 facilitar 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 ofrece un SDK de consentimiento, es decir, 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 anuncios a Google, se sirven anuncios personalizados que se seleccionan según los datos de usuario que se hayan recogido con anterioridad. Google también permite configurar las solicitudes de anuncios 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 y cómo reenviárselo al SDK de anuncios de Google para móviles cuando lo tengas.

Requisitos previos

Las aplicaciones pueden importar el SDK de consentimiento con una dependencia de Gradle que dirige al repositorio Maven de Google. Para usar este repositorio, debes hacer referencia a él en el archivo build.gradle a nivel de proyecto en 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 aún no aparece.

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

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

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

Añade la línea que aparece en negrita más arriba para indicar a Gradle que utilice la última versión del SDK de consentimiento. Cuando termines, guarda el archivo y sincroniza Gradle.

Antes de usar cualquier otro método en el SDK de consentimiento, debes actualizar el estado de consentimiento para asegurarte de que el SDK tiene 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 de tecnología ha cambiado desde que el usuario dio su consentimiento por última vez, el estado de consentimiento vuelve a ser desconocido.

Si no usas la mediación

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

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 de los proveedores de tecnología publicitaria que has seleccionado en la interfaz de usuario de AdMob. En ese caso, el SDK de consentimiento almacenará la respuesta del usuario.

La otra opción es usar el SDK de consentimiento para generar dinámicamente la lista completa de proveedores de tecnología publicitaria de AdMob, tal 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 dinámicamente la lista completa de proveedores de tecnología publicitaria de AdMob, tal como se explica en la sección Obtención de consentimiento gestionada por el editor. Tendrás que determinar para qué proveedores de tecnología publicitaria de otras redes tienes que solicitar el consentimiento a tus usuarios.

Como desarrollador de la aplicación, tienes 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 tienes que almacenar manualmente las respuestas de consentimiento de los usuarios y reenviar el consentimiento al SDK de anuncios de Google para móviles (si el usuario solo ha aceptado recibir anuncios no personalizados).

En este 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 activamente 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:

Si utilizas el SDK de consentimiento, te recomendamos que determines el estado de consentimiento del usuario cada vez que abra la aplicación. Para ello, tienes que hacer una llamada 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 a la que tu aplicación solicita los anuncios. Encuentra tu ID de editor.

  • Una instancia de ConsentInfoUpdateListener.

Si la información de consentimiento se actualiza correctamente, se proporciona el estado de consentimiento actualizado con el método onConsentInfoUpdated() de ConsentInfoUpdateListener. El ConsentStatus que se muestra puede tener estos valores:

Estado de 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 su consentimiento para que se le muestren anuncios personalizados o no personalizados, pero tampoco lo ha denegado.

Cuando la información de consentimiento esté actualizada correctamente, también podrás consultar ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown() para ver 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, es porque 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 tanto, puedes solicitar anuncios al SDK de anuncios de Google para móviles.

Si el método isRequestLocationInEeaOrUnknown() devuelve true pueden darse dos situaciones:

El SDK de consentimiento de Google proporciona dos métodos para obtener 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 ser adecuado si usas Google para monetizar tu aplicación, pero no podemos darte consejos legales al respecto. Para actualizar el mensaje de consentimiento del formulario de consentimiento 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 está configurado y se muestra mediante la clase ConsentForm. En el siguiente código se indica cómo crear un ConsentForm con 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 en el ciclo de vida del formulario de consentimiento.
Métodos anulables
onConsentFormLoaded El formulario de consentimiento se ha cargado correctamente.
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:
  • consentStatus es un valor ConsentStatus que describe el estado de consentimiento actualizado 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 los 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 publicidad.

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 el formulario de consentimiento renderizado por Google al usuario, 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 la elección del usuario y activa el evento onConsentFormClosed. Puedes procesar este evento y reenviar el consentimiento al SDK de anuncios de Google para móviles.

Si decides obtener el consentimiento por tu cuenta, puedes utilizar el método getAdProviders() de la clase ConsentInformation para obtener los proveedores de tecnología publicitaria asociados a los ID de editor usados en tu aplicación. Debes obtener el consentimiento de los usuarios para toda la lista de proveedores de tecnología publicitaria que corresponda a tus ID de editor.

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 los consentimientos, tendrás que registrar el ConsentStatus correspondiente con 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 de consentimiento, se debe asignar el parámetro TFUA a todas las solicitudes de anuncios (se trata de la etiqueta para identificar a los usuarios cuya edad es inferior a la edad de consentimiento en Europa). Para incluir esta etiqueta en todas las solicitudes de anuncios realizadas desde tu aplicación, llama a setTagForUnderAgeOfConsent(true). Esta configuración 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. TFUA inhabilita las solicitudes a proveedores de tecnología publicitaria de terceros, como los píxeles de medición de anuncios y los 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 de 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. Incluye tu dispositivo en la lista blanca como un dispositivo de depuración mediante el ID de publicidad de logcat:

    ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231");
    
  3. Por último, llama a setDebugGeography para configurar el área 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 de consentimiento tendrán en cuenta el área geográfica de depuración.

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 se soliciten únicamente anuncios de este tipo. 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 una característica de implementación interna del SDK de anuncios de Google para móviles que puede cambiar.

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.

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.