基于Google欧盟用户同意政策,DFP mediation自定义同意对话框方法咨询
我来帮你梳理下自定义DFP Mediation同意对话框的完整流程,你已经拿到了关键的adProviders列表,接下来就围绕这个列表做这几步:
自定义欧盟同意对话框的实操步骤
1. 解析AdProvider列表,构建用户可见的UI
每个AdProvider对象里包含了你需要展示给用户的核心信息:
getName():广告提供商的名称(比如Google AdMob、Unity Ads等)getPrivacyPolicyUrl():该提供商的隐私政策链接(要给用户跳转查看的入口)getId():提供商的唯一标识ID(后续提交同意状态会用到)
你需要在自定义对话框里清晰展示这些内容,比如:
- 开头说明:"为了提供广告服务,以下第三方广告商可能会收集你的数据用于个性化广告,你可以选择同意、拒绝或自定义允许的广告商"
- 列出所有广告商名称,每个名称旁搭配跳转隐私政策的按钮/链接
- 提供三个选项:同意个性化广告(允许所有广告商收集数据)、仅接受非个性化广告(不收集个性化数据)、自定义选择(让用户勾选具体允许的广告商)
举个简单的代码片段,用来遍历列表构建UI项:
// 遍历获取到的adProviders列表,逐个添加到对话框布局中 for (AdProvider provider : adProviders) { String providerName = provider.getName(); Uri privacyUrl = provider.getPrivacyPolicyUrl(); // 这里可以用TextView+CheckBox组合,或者自定义View来展示每个广告商的信息 CheckBox providerCheckbox = new CheckBox(context); providerCheckbox.setText(providerName); // 给Checkbox添加点击跳转隐私政策的逻辑(比如长按或右侧加图标) providerCheckbox.setOnLongClickListener(v -> { Intent intent = new Intent(Intent.ACTION_VIEW, privacyUrl); context.startActivity(intent); return true; }); // 将View添加到对话框的LinearLayout或RecyclerView中 dialogLayout.addView(providerCheckbox); }
2. 处理用户选择,构建同意状态数据
根据用户的选择,你需要对应生成ConsentStatus和(如果是自定义选择)AdProviderConsent列表:
- 若用户选同意所有:直接设置
ConsentStatus.PERSONALIZED,无需单独处理广告商 - 若用户选拒绝所有:设置
ConsentStatus.NON_PERSONALIZED - 若用户选自定义勾选:设置
ConsentStatus.PARTIAL,同时创建一个AdProviderConsent列表,把用户勾选的广告商ID和同意状态(PERSONALIZED)添加进去,未勾选的可以设置为NON_PERSONALIZED(根据需求调整)
示例代码处理自定义选择的情况:
List<AdProviderConsent> consentList = new ArrayList<>(); // 假设selectedProviders是用户勾选的AdProvider集合 for (AdProvider provider : selectedProviders) { consentList.add(new AdProviderConsent(provider.getId(), ConsentStatus.PERSONALIZED)); } // 处理未勾选的广告商(可选,若不需要细分也可以跳过) for (AdProvider provider : unselectedProviders) { consentList.add(new AdProviderConsent(provider.getId(), ConsentStatus.NON_PERSONALIZED)); }
3. 将同意状态同步到Google ConsentInformation
用户做出选择后,必须把状态提交给ConsentInformation,这样DFP Mediation才能根据用户的同意状态正确请求广告:
ConsentInformation consentInfo = ConsentInformation.getInstance(context); // 设置全局同意状态 consentInfo.setConsentStatus(yourSelectedConsentStatus); // 比如PERSONALIZED/NON_PERSONALIZED/PARTIAL // 如果是PARTIAL状态,还要提交广告商的具体同意列表 if (yourSelectedConsentStatus == ConsentStatus.PARTIAL) { consentInfo.setAdProviderConsents(consentList); } // 保存同意状态,避免下次启动重复询问 consentInfo.saveConsent(new ConsentInformation.OnConsentSavedListener() { @Override public void onConsentSaved() { // 同意状态保存成功,现在可以正常加载广告了 loadYourAds(); } @Override public void onFailedToSaveConsent(String errorDescription) { // 处理保存失败的情况,比如默认设置为NON_PERSONALIZED并加载广告 consentInfo.setConsentStatus(ConsentStatus.NON_PERSONALIZED); loadYourAds(); } });
4. 额外注意点
- 地区判断:每次启动应用时,先调用
consentInfo.isRequestLocationInEeaOrUnknown(),只有用户在欧盟地区或未知地区时,才需要展示同意对话框 - 修改入口:在应用的设置页面要保留修改同意状态的入口,允许用户随时更改选择
- 测试模式:开发阶段可以用
consentInfo.setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA)强制开启欧盟地区模式,方便测试对话框逻辑
内容的提问来源于stack exchange,提问作者Tien Nguyen Huu




