Requesting Consent from European Users

根据 Google《欧盟地区用户意见征求政策》,您必须向位于欧洲经济区 (EEA) 内的用户披露相关信息;在法律有相应要求的情况下,您必须征得他们的同意才能使用 Cookie 或其他本地存储方式;您同样必须征得他们的同意才能使用个人数据(例如 AdID)来投放广告。此政策反映了《欧盟网络隐私保护指令》和《一般数据保护条例》(GDPR) 的要求。

为了帮助发布商履行此政策规定的职责,Google 提供了 Consent SDK。Consent SDK 是一个开源库,提供用于征求用户意见的实用程序函数。完整源代码可在 GitHub 上找到。

Google 投放的广告可分为个性化广告和非个性化广告,这两类广告都需要在欧洲经济区 (EEA) 内征求用户意见。默认情况下,向 Google 发出的广告请求会投放个性化广告,并根据以前收集的用户数据进行广告选择。Google 也支持通过配置广告请求来投放非个性化广告。 详细了解个性化广告和非个性化广告

本指南介绍了如何使用 Consent SDK 征求用户意见,以及在征得用户意见后如何将用户意见转发给 Google 移动广告 SDK

前提条件

应用可以使用指向 Google Maven 代码库的 Gradle 依赖项导入 Consent SDK。要使用该代码库,您需要在应用的项目级 build.gradle 文件中引用该代码库。请打开您应用中的这一文件并找到 allprojects 部分:

项目级 build.gradle 示例(节选)

allprojects {
    repositories {
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }
}

如果上面的 maven 指令不存在,请添加该指令。

接下来,请打开您应用的应用级 build.gradle 文件并找到“dependencies”部分。

应用级 build.gradle 示例(节选)

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

请添加上面的粗体行代码,该代码会指示 Gradle 提取最新版本的 Consent SDK。添加完该代码后,请保存文件并执行“Gradle sync”。

在使用 Consent SDK 中的任何其他方法之前,您都应该更新用户意见状态,以确保 Consent SDK 具有您在AdMob界面中所选择的广告技术提供商的最新信息。如果自用户上次提供用户意见后,广告技术提供商列表出现任何更改,则会将用户意见状态重新设置为未知状态。

如果您不使用中介

如果您不使用中介,则有两种方法可以实现 Consent SDK 来征求用户意见。

一种方法是使用 Consent SDK 向用户显示由 Google 呈现的用户意见征求表单。该用户意见征求表单会显示您在AdMob界面中选择的广告技术提供商列表。而 Consent SDK 会存储用户的意见回复。

另一种方法是使用 Consent SDK 从AdMob动态获取广告技术提供商的完整列表,详情请参阅由发布商管理的用户意见征求。但是,在这种情况下,您需要确定如何向用户呈现提供商列表,并向用户显示您自己的用户意见征求表单。

一旦用户做出了用户意见选择,您可以让 Consent SDK 存储该用户的意见选择,详情请参阅存储由发布商管理的用户意见

征得用户意见后,如果用户仅同意接收非个性化广告,则您需要将用户意见转发给 Google 移动广告 SDK

如果您使用AdMob中介

您可以使用 Consent SDK 从AdMob动态获取广告技术提供商的完整列表,详情请参阅由发布商管理的用户意见征求。对于来自其他广告联盟的广告技术提供商,您需要确定应向用户显示其中哪些提供商来征求用户意见。

作为应用开发者,您既需要为 Consent SDK 所返回的广告技术提供商征求用户意见,也需要为来自其他广告联盟的提供商征求用户意见。如果用户仅同意接收非个性化广告,那么您还需要手动存储用户的意见回复,并将用户意见转发给 Google 移动广告 SDK

Google 目前无法为中介广告联盟征求和处理用户意见,因此您需要为每个广告联盟单独征求和处理用户意见。我们正积极与所有开源且标明了版本的中介广告联盟合作,以提供有关如何转发用户意见的详细更新文档。以下中介广告联盟的有关文档已发布:

使用 Consent SDK 时,建议您在每次启动应用时都要确定用户的意见状态。为此,请在 ConsentInformation 的实例上调用 requestConsentInfoUpdate()

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

调用 requestConsentInfoUpdate() 需要两个参数:

  • 一组发布商 ID,供您的应用发出广告请求。 找到您的发布商 ID

  • 一个 ConsentInfoUpdateListener 的实例。

如果成功更新用户意见信息,那么会通过 ConsentInfoUpdateListeneronConsentInfoUpdated() 方法提供更新后的用户意见状态。返回的 ConsentStatus 可能具有下列值:

用户意见状态 定义
ConsentStatus.PERSONALIZED 用户已同意接收个性化广告。
ConsentStatus.NON_PERSONALIZED 用户已同意接收非个性化广告。
ConsentStatus.UNKNOWN 用户既未同意接收也未拒绝接收个性化广告或非个性化广告。

用户意见信息更新成功后,您还可以检查 ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown(),以查看用户是否位于欧洲经济区内或者请求位置是否未知。

如果 isRequestLocationInEeaOrUnknown() 方法返回 false,则该用户不在欧洲经济区内,并且无需根据《欧盟地区用户意见征求政策》征求用户意见。您可以向 Google 移动广告 SDK 发出广告请求。

如果 isRequestLocationInEeaOrUnknown() 方法返回 true

Google 的 Consent SDK 提供了两种征求用户意见的方法:

请务必记住为用户提供更改或撤消用户意见的选项。

由 Google 呈现的用户意见征求表单显示在应用内容之上,是一种可配置的全屏表单。在进行相关配置后,您可向用户显示以下选项组合而成的内容:

  • 同意观看个性化广告
  • 同意观看非个性化广告
  • 使用付费版本应用而不观看广告

您应该仔细阅读用户意见文本。一般来说,当您为了通过应用获利而使用 Google 时,默认情况下显示的信息可能已适合您的需要;但对于哪种意见文本适合您的情况,我们无法提供任何法律建议。如要更新由 Google 呈现的用户意见征求表单中的用户意见文本,可根据需要修改 Consent SDK 中的 consentform.html 文件。

您可以使用 ConsentForm 类来配置和显示由 Google 呈现的用户意见征求表单。以下代码演示了如何使用所有三个用户意见选项构建 ConsentForm

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();

上述方法使用以下选项准备由 Google 呈现的用户意见征求表单:

withListener()
ConsentForm 注册监听器。ConsentFormListener 中每种可替换的方法均与用户意见征求表单生命周期中的一个事件对应。
可替换的方法
onConsentFormLoaded 用户意见征求表单已成功加载。
onConsentFormError 用户意见征求表单加载失败。errorDescription 参数提供了错误描述。
onConsentFormOpened 用户意见征求表单已打开。
onConsentFormClosed 用户意见征求表单已关闭。该方法的参数提供了以下信息:
  • consentStatus 是描述更新后的用户意见状态的 ConsentStatus 值。
  • 当用户选择使用付费版本应用而不观看广告时,userPrefersAdFree 的值是 true
withPersonalizedAdsOption()
表示用户意见征求表单应显示个性化广告选项。
withNonPersonalizedAdsOption()
表示用户意见征求表单应显示非个性化广告选项。
withAdFreeOption()
表示用户意见征求表单应显示无广告应用选项。

创建 ConsentForm 对象后,请通过调用 ConsentFormload() 方法来加载用户意见征求表单,如下所示:

form.load();

要向用户显示由 Google 呈现的用户意见征求表单,请在 ConsentForm 的实例上调用 show(),如下所示:

form.show();

在用户选择一个选项并关闭表单后,Consent SDK 会保存用户的选择并触发 onConsentFormClosed 事件。您可以监听此事件并将用户意见转发给 Google 移动广告 SDK

如果您选择自行征求用户意见,则可以使用 ConsentInformation 类的 getAdProviders() 方法来获取与您应用中使用的发布商 ID 相关联的广告技术提供商。请注意,凡是针对您的发布商 ID 配置的所有广告技术提供商,您均需为其征求用户意见。

List<AdProvider> adProviders =
    ConsentInformation.getInstance(context).getAdProviders();

然后,您可以使用广告技术提供商列表自行征求用户意见。

征得用户意见后,请使用 ConsentInformation 类的 setConsentStatus() 方法记录用户回复所对应的 ConsentStatus

ConsentInformation.getInstance(context)
    .setConsentStatus(ConsentStatus.PERSONALIZED);

在将用户意见报告给 Consent SDK 后,您可以将用户意见转发给 Google 移动广告 SDK

要允许用户更新其意见,只需在用户选择更新其意见状态时重复征求用户意见部分列出的步骤。

如果发布商知道用户未达到自主年龄,则所有广告请求都必须设置 TFUA(“Tag For Users under the Age of Consent in Europe”)标记,以表示用户位于欧洲境内但未达到自主年龄。要在您应用发出的所有广告请求中包含此标记,请调用 setTagForUnderAgeOfConsent(true)。此设置将在以后的所有广告请求中生效。

ConsentInformation.getInstance(context).setTagForUnderAgeOfConsent(true);

一旦启用 TFUA 设置,将无法加载由 Google 呈现的用户意见征求表单。因此,凡是包含 TFUA 的所有广告请求,均将无法投放个性化广告和再营销广告。TFUA 禁止向第三方广告技术(例如广告衡量像素和第三方广告服务器)提供商发送请求。

要从广告请求中移除 TFUA,请调用 setTagForUnderAgeOfConsent(false)

测试

Consent SDK 的行为会有所不同,具体取决于 ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown() 的值。 例如,如果用户不在欧洲经济区 (EEA) 内,则无法加载用户意见征求表单。

为了让您在欧洲经济区 (EEA) 境内和境外都能更轻松地测试您的应用,Consent SDK 支持可在调用 Consent SDK 中的任何其他方法前进行设置的调试选项。

  1. 按照更新用户意见状态部分中的说明调用 requestConsentInfoUpdate。然后运行您的应用。请检查以下日志的 logcat 输出值:

    I/ConsentInformation: Use
    ConsentInformation.getInstance(context).addTestDevice("**33BE2250B43518CCDA7DE426D04EE231**")
    to get test ads on this device.
  2. 使用 logcat 中的广告 ID 将您的设备作为调试设备列入白名单:

    ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231");
    
  3. 最后,请调用 setDebugGeography 设置您的首选地理测试位置。

    // 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);
    

完成这些步骤后,调用更新用户意见状态时均会将您的调试地理位置考虑在内。

默认的 Google 移动广告 SDK 行为是投放个性化广告。如果用户仅同意接收非个性化广告,您可以配置AdRequest对象,以指定只应请求非个性化广告。无论用户是否在欧洲经济区 (EEA) 内,以下代码都会导致请求非个性化广告:

Bundle extras = new Bundle();
extras.putString("npa", "1");

AdRequest request = new AdRequest.Builder()
        .addNetworkExtrasBundle(AdMobAdapter.class, extras)
        .build();

如果请求的是非个性化广告,则广告请求网址目前会包含 &npa=1。但请注意,这是 Google 移动广告 SDK 的内部实现细节,随时可能会出现更改。

常见问题解答

Consent SDK 支持多少家广告技术提供商?
Consent SDK 不限制发布商选择启用的广告技术提供商数量。
如果我在AdMob界面中更改我的选择,是否会自动更新 SDK 返回的广告技术提供商列表?
会。如果您对AdMob界面中的广告技术提供商列表进行了更改,那么这些更改会在大约一小时内传播到 Google 的广告服务器。

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面