根据 Google《欧盟地区用户意见征求政策》,您必须向位于欧洲经济区 (EEA) 内的用户披露相关信息;在法律有相应要求的情况下,您必须征得他们的同意才能使用 Cookie 或其他本地存储方式;您同样必须征得他们的同意才能使用个人数据(如 AdID)来投放广告。此政策反映了《欧盟电子隐私指令》和《一般数据保护条例》(GDPR) 的要求。
为了帮助发布商履行此政策规定的职责,Google 提供了 Consent SDK。Consent SDK 是一个开源代码库,提供用于征求用户意见的实用函数。完整源代码可在 GitHub 上找到。
Google 投放的广告可分为个性化广告和非个性化广告,投放这两类广告都需要征求欧洲经济区 (EEA) 内用户的同意。默认情况下,向 Google 发出的广告请求会投放个性化广告,并根据以前收集的用户数据筛选广告。Google 也支持通过配置广告请求来投放非个性化广告。详细了解个性化广告和非个性化广告。
本指南介绍了如何使用 Consent SDK 征求用户意见,以及在征得用户意见后如何将用户意见转发给 Google 移动广告 SDK。
前提条件
- 登录到您的 AdMob 帐号,然后选择广告技术提供商。
导入 Consent SDK
通过使用指向 Google Maven 代码库的 Gradle 依赖项,应用可以导入 Consent SDK。要使用该代码库,您需要在应用的项目级 build.gradle
文件中对其进行引用。请打开该文件,并找到 allprojects
部分:
项目级 build.gradle 示例(节选)
allprojects { repositories { google() jcenter() } }
如果上面的 google()
指令不存在,请添加该指令。
接下来,请打开您应用的应用级 build.gradle
文件,并找到“dependencies”部分。
应用级 build.gradle 示例(节选)
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.ads.consent:consent-library:1.0.6' }
请添加上面的粗体代码行,该代码会指示 Gradle 提取最新版本的 Consent SDK。添加完该代码后,请保存文件并执行“Gradle 同步”。
Consent SDK 的使用提示
在使用 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
的实例。
如果成功更新用户意见信息,那么会通过 ConsentInfoUpdateListener
的 onConsentInfoUpdated()
方法提供更新后的用户意见状态。返回的 ConsentStatus
可能具有下列值:
用户意见状态 | 定义 |
---|---|
ConsentStatus.PERSONALIZED |
用户已同意接收个性化广告。 |
ConsentStatus.NON_PERSONALIZED |
用户已同意接收非个性化广告。 |
ConsentStatus.UNKNOWN |
用户既未同意接收也未拒绝接收个性化广告或非个性化广告。 |
用户意见信息更新成功后,您还可以检查 ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown()
,以查看用户是否位于欧洲经济区内或者请求位置是否未知。
如果 isRequestLocationInEeaOrUnknown()
方法返回 false
,则表明该用户不在欧洲经济区内,并且无需根据《欧盟地区用户意见征求政策》征求用户意见。您可以向 Google 移动广告 SDK 发出广告请求。
如果 isRequestLocationInEeaOrUnknown()
方法返回 true
:
如果返回的
ConsentStatus
为PERSONALIZED
或NON_PERSONALIZED
,则表明用户已提供用户意见。您现在可以将用户意见转发给 Google 移动广告 SDK。如果返回的
ConsentStatus
为UNKNOWN
,则请参阅下面的“征求用户意见”部分,其中介绍了如何使用实用程序方法来征求用户意见。
征求用户意见
Google 的 Consent SDK 提供了两种征求用户意见的方法:

向用户显示由 Google 呈现的用户意见征求表单。
通过由发布商管理的用户意见征求方法,请求广告技术提供商列表并自行征求用户意见。
请务必记住为用户提供更改或撤消用户意见的选项。
由 Google 呈现的用户意见征求表单
由 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
对象后,请通过调用 ConsentForm
的 load()
方法来加载用户意见征求表单,如下所示:
form.load();
显示用户意见征求表单
要向用户显示由 Google 呈现的用户意见征求表单,请在 ConsentForm
的实例上调用 show()
,如下所示:
form.show();
在用户选择一个选项并关闭表单后,Consent SDK 会保存用户的选择并触发 onConsentFormClosed
事件。您可以监听此事件并将用户意见转发给 Google 移动广告 SDK。
由发布商管理的用户意见征求
如果您选择自行征求用户意见,则可以使用 ConsentInformation
类的 getAdProviders()
方法来获取与您应用中使用的发布商 ID 相关联的广告技术提供商。请注意,凡是针对您的发布商 ID 配置的所有广告技术提供商,您均需为其征求用户意见。
您必须等待 ConsentInfoUpdateListener
的 onConsentInfoUpdate()
方法完成后才能调用 getAdProviders()
,详情请参阅更新用户意见状态部分。
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 中的任何其他方法前进行设置的调试选项。
按照更新用户意见状态部分中的说明调用
requestConsentInfoUpdate
。然后运行您的应用。请检查以下日志的 logcat 输出值:I/ConsentInformation: Use ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231") to get test ads on this device.
使用 logcat 中的广告 ID 将您的设备指定为测试设备:
ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231");
最后,请调用
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
此部分中的代码可用于任何版本的 Google 移动广告 SDK。无论您是否使用 Consent SDK 征求用户意见,均可使用这些代码。
默认的 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 的内部实现细节,随时可能会出现更改。
延迟应用衡量(可选)
默认情况下,Google 移动广告 SDK 会初始化应用衡量标准,然后在应用启动时立即开始向 Google 发送用户级事件数据。此初始化行为确保您可以启用 AdMob 用户指标,而无需对代码做出其他更改。
但是,如果您的应用需要在征求用户意见后才能发送这些事件,则可以延迟应用衡量,直到您显式声明移动广告 SDK 初始化或加载广告为止。
要延迟应用衡量,请在 AndroidManifest.xml
中添加以下 <meta-data>
标记。
<manifest> <application> <!-- Delay app measurement until MobileAds.initialize() is called. --> <meta-data android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT" android:value="true"/> </application> </manifest>
常见问题解答
- Consent SDK 支持多少家广告技术提供商?
- Consent SDK 不限制发布商选择启用的广告技术提供商数量。
- 如果我在 AdMob 界面中更改我的选择,系统是否会自动更新 SDK 返回的广告技术提供商列表?
- 会。如果您对 AdMob 界面中的广告技术提供商列表进行了更改,那么这些更改会在大约一小时内传播到 Google 的广告服务器。