Получите сбрасываемый пользователем рекламный идентификатор . Часть Android Jetpack .

Чтобы защитить конфиденциальность пользователей, всем приложениям Android рекомендуется использовать идентификаторы, сбрасываемые пользователем. Одним из таких идентификаторов является рекламный идентификатор , который уникально идентифицирует конкретного пользователя для случаев использования рекламы, таких как персонализация рекламы.

Чтобы поддерживать стандартизированное решение для отслеживания рекламы на устройствах, на которых работает ваше приложение, вы можете использовать библиотеку рекламных идентификаторов . Эта библиотека, доступная на устройствах под управлением Android 4.0 (уровень API 14) и выше, определяет интерфейс для взаимодействия с поставщиками рекламы на системном уровне. Этот интерфейс позволяет вашему приложению получать согласованные значения рекламных идентификаторов.

Поставщик рекламы, включенный в библиотеку рекламных идентификаторов, также определяет стандартное намерение открытия экрана настроек, которое реализует поставщик рекламы. Этот экран настроек позволяет пользователю сбросить свой рекламный идентификатор и отказаться от персонализации рекламы.

В этом руководстве объясняется, как использовать клиентский модуль библиотеки рекламных идентификаторов для получения согласованного рекламного идентификатора для каждого пользователя устройства. Затем в этом руководстве представлен обзор архитектуры библиотеки.

Настройте клиентское приложение

Взаимодействуя с клиентским модулем библиотеки рекламных идентификаторов, ваше приложение может получить согласованный рекламный идентификатор, представляющий пользователя, взаимодействующего с приложением.

Рекламный идентификатор представляется с использованием версии 3 формата универсального уникального идентификатора (UUID) или эквивалентного 128-битного формата:

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

Библиотека рекламных идентификаторов нормализует возвращаемое значение по мере необходимости для предоставления идентификаторов в этом формате.

Чтобы получить сбрасываемый пользователем рекламный идентификатор для вашего приложения, выполните следующие действия:

  1. Проверьте, доступен ли поставщик рекламы, вызвав AdvertisingIdClient.isAdvertisingIdProviderAvailable() . Если этот метод возвращает false , ваше приложение должно использовать другие средства для выполнения любых необходимых вариантов использования отслеживания рекламы.

  2. Получите сведения об идентификаторе объявления, включая рекламный идентификатор, вызвав AdvertisingIdClient.getAdvertisingIdInfo() . Библиотека рекламных идентификаторов выполняет этот метод в рабочем потоке и использует 10-секундный тайм-аут соединения.

В следующем фрагменте кода показано, как получить рекламный идентификатор вместе с другой информацией от поставщика рекламы:

приложение/build.gradle

классный

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

Котлин

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")
}

Мойадидклиент

Котлин

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

Ява

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

Архитектура библиотеки рекламных идентификаторов

Схема архитектуры
Рисунок 1. Архитектура библиотеки рекламных идентификаторов

На рисунке 1 изображена структура библиотеки рекламных идентификаторов. Библиотека состоит из следующих модулей:

  • Клиентский модуль — тонкий слой, включенный в приложения.
  • Модуль провайдера , который предоставляет производитель устройства. Реализации этого модуля должны определять пользовательский интерфейс настроек, чтобы предоставить пользователям возможность сбрасывать свой рекламный идентификатор и переключать настройки отслеживания рекламы.

Клиентский модуль связывается с модулем провайдера для получения рекламных идентификаторов и предпочтений пользователя в отношении отслеживания рекламы.

Как библиотека обрабатывает несколько поставщиков

Устройство может одновременно поддерживать несколько поставщиков рекламы на системном уровне. Если библиотека рекламных идентификаторов обнаруживает эту ситуацию, она гарантирует, что ваше приложение всегда получает информацию от одного и того же поставщика, при условии, что поставщик остается доступным. Этот процесс обеспечивает согласованность рекламного идентификатора.

Если набор доступных поставщиков рекламы со временем меняется и ваше приложение взаимодействует с другим поставщиком идентификаторов рекламы, все другие клиентские приложения также начинают использовать этого нового поставщика. Ваше приложение демонстрирует то же поведение, которое произошло бы, если бы пользователь запросил сброс своего рекламного идентификатора.

Библиотека поставщиков рекламных идентификаторов использует следующий детерминированный порядок для ранжирования поставщиков:

  1. Поставщики, запросившие разрешение androidx.ads.identifier.provider.HIGH_PRIORITY .
  2. Провайдеры, которые установлены на устройстве дольше всего.
  3. Поставщики, которые появляются первыми в алфавитном порядке.