Android NDK开发详解用户数据和身份之获取用户可重置的广告 ID

Android NDK开发详解用户数据和身份之获取用户可重置的广告 ID

为了保护用户隐私,所有 Android 应用都应该使用用户可重置的标识符。例如,广告 ID 就是这样的一种标识符,它唯一地标识广告用例(例如广告个性化)的特定用户。

如需在运行您的应用的不同设备上支持标准化的广告跟踪解决方案,您可以使用 Jetpack 附带的广告 ID 库。该库可在搭载 Android 4.0(API 级别 14)及更高版本的设备上使用,它定义了与系统级广告提供程序进行交互的接口。此接口可让您的应用接收一致的广告 ID 值。

广告 ID 库随附的广告提供程序还定义了一个标准 intent,用于打开广告提供程序实现的设置屏幕。用户可以在此设置屏幕中重置其广告 ID 以及选择停用广告个性化功能。

本指南介绍了如何使用广告 ID 库的客户端模块为每个设备用户获得一致的广告 ID,然后简要说明该库的架构。
注意:如果您打算使用 Google Play 发布和分发应用,请使用 Google Play 服务中提供的广告标识符库,而不是本文介绍的这个库。

配置客户端应用

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

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

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

广告 ID 库会根据需要标准化返回值,以使用此格式来提供 ID。
注意:大多数广告提供程序都会确保每个设备用户的广告 ID 是唯一的。在支持多个用户(包括访客用户在内)的 Android 设备上,您的应用可能会在同一设备上获得不同的广告 ID。这些不同的 ID 对应于登录该设备的不同用户。

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

通过调用 AdvertisingIdClient.isAdvertisingIdProviderAvailable() 检查是否有可用的广告提供程序。如果此方法返回 false,则您的应用应使用其他方式来执行任何必要的广告跟踪用例。
注意:即使此方法返回 true,您的应用也需要能够处理在尝试检索广告 ID 时可能发生的任何异常。

通过调用 AdvertisingIdClient.getAdvertisingIdInfo() 获得广告标识符的详细信息,包括广告 ID。广告 ID 库在工作线程上执行此方法,并使用 10 秒连接超时。
注意:由于用户可以在应用启动后重置自己的广告 ID,因此,在应用每次需要检查 ID 值时,您都应该调用 AdvertisingIdClient.getAdvertisingIdInfo()。不要缓存该值。

以下代码段展示了如何检索广告 ID 以及来自广告提供程序的其他信息:

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

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
                }

                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 ads 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 ads 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 get 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 ads 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 ads use cases.
        }
    }
    

广告 ID 库架构

架构示意图
图 1. 广告 ID 库架构
在这里插入图片描述

图 1 中的示意图说明了广告 ID 库的结构。该库包含以下模块:

客户端模块,它是应用中包含的一个薄层。
提供程序模块,由设备制造商提供。此模块的实现必须定义设置界面,供用户重置其广告 ID 和切换广告跟踪偏好设置。

客户端模块与提供程序模块进行通信,以检索广告 ID 和有关广告跟踪的用户偏好设置。

广告 ID 库如何处理多个提供程序

一台设备可以同时支持多个系统级的广告提供程序。如果广告 ID 库检测到这种情况,它会确保您的应用始终从同一个提供程序检索信息,但前提是该提供程序保持可用。此过程可让广告 ID 保持一致。

如果可用的广告提供程序随着时间发生变化,使得您的应用与其他广告标识符提供程序进行交互,则所有其他客户端应用也会开始使用这一新的提供程序。您的应用将表现出与用户请求重置其广告 ID 时相同的行为。

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

已请求 androidx.ads.identifier.provider.HIGH_PRIORITY 权限的提供程序。
在设备上安装时间最长的提供程序。
按字母顺序最先显示的提供程序。

本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。

最后更新时间 (UTC):2020-06-05。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五一编程

程序之路有我与你同行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值