Android:使用AdMob Consent SDK判断地域时首次启动异常问题
解决AdMob Consent SDK首次启动
isRequestLocationInEeaOrUnknown()返回错误值的问题 我之前碰到过完全一样的问题!其实核心原因是没搞清楚AdMob Consent SDK的异步执行逻辑:
当你在onCreate里调用requestConsentInfoUpdate()时,这个方法是异步请求服务器获取用户位置和 consent 状态的,而你紧接着直接调用isRequestLocationInEeaOrUnknown(),这时候SDK还没完成服务器请求,只能返回默认的false。
- 退出重启后,SDK已经把之前获取到的位置信息缓存到本地了,所以能立刻返回正确的
true - 清除应用数据后缓存被清空,又回到首次启动的初始状态,所以再次返回
false - 用
AsyncTask能“碰巧”正常工作,是因为异步任务的执行有一定延迟,刚好等SDK完成了服务器请求,但这种方式完全不可靠——如果网络慢一点,还是会出问题
正确的解决方案:依赖ConsentInfoUpdateListener回调
你必须把判断EEA区域和展示授权弹窗的逻辑,放到onConsentInfoUpdated回调方法里,因为这个方法触发时,SDK已经完成了所有信息的更新,此时调用isRequestLocationInEeaOrUnknown()才能拿到准确结果。
修改后的代码示例:
public class MainActivity extends Activity { ... @Override protected void onCreate(Bundle savedInstanceState) { ... ConsentInformation consentInformation = ConsentInformation.getInstance(context); String[] publisherIds = {"pub-xxxxxxxxxxxxxxxx"}; consentInformation.requestConsentInfoUpdate(publisherIds, new ConsentInfoUpdateListener() { @Override public void onConsentInfoUpdated(ConsentStatus consentStatus) { // 在这里处理EEA判断和弹窗逻辑! boolean isEeaOrUnknown = ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown(); if (isEeaOrUnknown) { // 展示自定义授权弹窗 showCustomConsentDialog(); } else { // 非EEA区域,直接加载广告 loadAds(); } } @Override public void onFailedToUpdateConsentInfo(String errorDescription) { // 请求失败时的处理,比如默认按非EEA处理,或者重试 Log.e("ConsentSDK", "Failed to update consent info: " + errorDescription); loadAds(); } }); ... } ... }
额外注意事项
- 确保你已经在
AndroidManifest.xml里添加了必要的网络权限(INTERNET和ACCESS_NETWORK_STATE),否则SDK无法完成位置信息请求 - 如果用户处于离线状态,SDK会优先使用缓存的位置信息;如果没有缓存,才会返回
false,这时候可以考虑在失败回调里做降级处理
内容的提问来源于stack exchange,提问作者Zippy
相关产品推荐
相关产品推荐

