获取用户可重置的广告 ID Android Jetpack 的一部分。

为了保护用户隐私,所有 Android 应用最好都使用用户可重置的标识符。其中一种标识符是广告 ID,它可唯一标识特定用户以用于广告用例,例如广告个性化。

为了在运行您的应用的设备上支持标准化的广告追踪解决方案,您可以使用 广告 ID 库。此库可在运行 Android 4.0(API 级别 14)及更高版本的设备上使用,它定义了一个与系统级广告提供商交互的界面。此界面允许您的应用接收一致的广告 ID 值。

包含在广告 ID 库中的广告提供商还定义了一个标准意图,用于打开广告提供商实现的设置屏幕。此设置屏幕允许用户重置其广告 ID 并选择退出广告个性化。

本指南介绍如何使用广告 ID 库的客户端模块在每个设备用户的基础上获取一致的广告 ID。然后,本指南将介绍该库的架构概述。

配置您的客户端应用

通过与广告 ID 库的客户端模块交互,您的应用可以检索表示与应用交互的用户的一致广告 ID。

广告 ID 使用第 3 版 通用唯一标识符 (UUID) 格式 或等效的 128 位格式表示。

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

广告 ID 库会根据需要规范化返回值,以提供使用此格式的 ID。

要为您的应用检索用户可重置的广告 ID,请完成以下步骤

  1. 通过调用 AdvertisingIdClient.isAdvertisingIdProviderAvailable() 检查广告提供商是否可用。如果此方法返回 false,您的应用应使用其他方法执行任何所需的广告追踪用例。

  2. 通过调用 AdvertisingIdClient.getAdvertisingIdInfo() 获取广告标识符详细信息,包括广告 ID。广告 ID 库在工作线程上执行此方法,并使用 10 秒的连接超时。

以下代码片段演示了如何从广告提供商检索广告 ID 及其他信息

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

广告 ID 库架构

Architecture diagram
图 1. 广告 ID 库架构

图 1 描述了广告 ID 库的结构。该库包含以下模块:

  • 客户端模块,这是一个包含在应用中的薄层。
  • 提供程序模块,设备制造商提供。此模块的实现必须定义一个设置 UI,以使用户能够重置其广告 ID 并切换广告追踪偏好。

客户端模块与提供程序模块通信以检索广告 ID 和用户关于广告追踪的偏好。

库如何处理多个提供程序

设备可能同时支持多个系统级广告提供程序。如果广告 ID 库检测到这种情况,它将确保您的应用始终从同一提供程序检索信息(假设提供程序仍然可用)。此过程可保持广告 ID 的一致性。

如果可用的广告提供商集合随时间变化,并且您的应用与不同的广告标识符提供商交互,则所有其他客户端应用也将开始使用该新的提供商。您的应用将展示与用户请求重置其广告 ID 时发生的行为相同的行为。

广告 ID 提供商库使用以下确定性顺序对提供商进行排名:

  1. 已请求androidx.ads.identifier.provider.HIGH_PRIORITY权限的提供商。
  2. 已安装在设备上的时间最长的提供商。
  3. 按字母顺序排列在前的提供商。