Receber um ID de publicidade que pode ser redefinido pelo usuário Parte do Android Jetpack

Para proteger a privacidade do usuário, é uma prática recomendada que todos os apps Android funcionem com identificadores reconfiguráveis pelo usuário. Um desses identificadores é o ID de publicidade, que identifica exclusivamente um usuário específico para casos de uso de publicidade, como personalização de anúncios.

Para oferecer uma solução padronizada de rastreamento de anúncios nos dispositivos que executam seu app, você pode usar a biblioteca Advertising ID. Essa biblioteca, disponível em dispositivos com o Android 4.0 (API de nível 14) e versões mais recentes, define uma interface para interagir com provedores de anúncios no nível do sistema. Essa interface permite que o app receba valores consistentes de ID de publicidade.

O provedor de anúncios incluído na biblioteca de ID de publicidade também define uma intent padrão para abrir uma tela de configurações implementada por ele. Essa tela de configurações permite que o usuário redefina o ID de publicidade e desative a personalização de anúncios.

Neste guia, explicamos como usar o módulo de cliente da biblioteca de IDs de publicidade para receber um ID de publicidade consistente para cada usuário do dispositivo. Este guia apresenta uma visão geral da arquitetura da biblioteca.

Configurar o app de cliente

Ao interagir com o módulo de cliente da biblioteca de IDs de publicidade, seu app pode recuperar um ID de publicidade consistente que representa o usuário que está interagindo com ele.

O ID de publicidade é representado usando a versão 3 do formato de identificador universal exclusivo (UUID, na sigla em inglês) ou um formato equivalente de 128 bits:

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

A biblioteca de IDs de publicidade normaliza o valor de retorno conforme necessário para fornecer IDs usando esse formato.

Para recuperar o ID de publicidade que pode ser redefinido pelo usuário para seu app, siga estas etapas:

  1. Para conferir se um provedor de anúncios está disponível, chame AdvertisingIdClient.isAdvertisingIdProviderAvailable(). Se esse método retornar false, seu app precisará usar outros meios para realizar todos os casos de uso de rastreamento de anúncios necessários.

  2. Consiga os detalhes do identificador de anúncios, incluindo o ID de publicidade, chamando AdvertisingIdClient.getAdvertisingIdInfo(). A biblioteca Advertising ID executa esse método em uma linha de execução de worker e usa um tempo limite de conexão de 10 segundos.

O snippet de código a seguir demonstra como recuperar o ID de publicidade com outras informações do provedor de anúncios:

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.
    }
}

Arquitetura da biblioteca Advertising ID

Diagrama da arquitetura
Figura 1. Arquitetura da biblioteca Advertising ID

A Figura 1 mostra a estrutura da biblioteca de ID de publicidade. A biblioteca consiste nos seguintes módulos:

  • Um módulo de cliente, que é uma camada fina incluída nos apps.
  • Um módulo de provedor, que o fabricante do dispositivo disponibiliza. As implementações desse módulo precisam definir uma interface de configurações para oferecer aos usuários a capacidade de redefinir o ID de publicidade e alternar as preferências de rastreamento de anúncios.

O módulo do cliente se comunica com o do provedor para extrair IDs de publicidade e preferências do usuário sobre o rastreamento de anúncios.

Como a biblioteca lida com vários provedores

É possível que um dispositivo ofereça suporte a vários provedores de anúncios no nível do sistema ao mesmo tempo. Se a biblioteca de IDs de publicidade detectar essa situação, ela vai garantir que o app sempre extraia informações do mesmo provedor, supondo que ele permaneça disponível. Esse processo mantém o código de publicidade consistente.

Se o conjunto de provedores de anúncios disponíveis mudar com o tempo e seu app interagir com um provedor de identificador de anúncio diferente, todos os outros apps clientes também começarão a usar esse novo provedor. O app demonstra o mesmo comportamento que teria ocorrido se o usuário tivesse solicitado a redefinição do ID de publicidade.

A biblioteca de provedor do ID de publicidade usa a seguinte ordem determinística para classificar os provedores:

  1. Provedores que solicitaram a permissão androidx.ads.identifier.provider.HIGH_PRIORITY.
  2. Provedores instalados no dispositivo há mais tempo.
  3. Provedores que aparecem primeiro em ordem alfabética.