我通过结合使用 Consent SDK 和我自己的代码来解决这个问题。每次用户进入应用程序(不知道是否应该这样做,经常这样做)时,我都会初始化Consent SDK。
private fun getConsentStatus() {
val consentInformation = ConsentInformation.getInstance(requireContext())
consentInformation.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
consentInformation.debugGeography = DebugGeography.DEBUG_GEOGRAPHY_EEA
val ids = arrayOf("pub-77777777777")
consentInformation.requestConsentInfoUpdate(ids, object : ConsentInfoUpdateListener {
override fun onConsentInfoUpdated(consentStatus: ConsentStatus) {
// User's consent status successfully updated.
if (consentInformation.isRequestLocationInEeaOrUnknown) {
when (consentStatus) {
ConsentStatus.UNKNOWN -> displayConsentForm()
ConsentStatus.PERSONALIZED -> proceed(true, true)
ConsentStatus.NON_PERSONALIZED -> proceed(false, true)
}
} else {
// Not in EU, displaying personalized ads
proceed(true, false)
}
}
override fun onFailedToUpdateConsentInfo(errorDescription: String) {
// User's consent status failed to update.
AdvertisingInitialization(requireContext(), prefs, false)
proceedWithoutUpdate()
}
})
}
private fun proceedWithoutUpdate(isInEu: Boolean = false){
AdvertisingInitialization(requireContext(), prefs, isInEu)
(activity as LandingActivity).navigateToContentActivity()
}
/**
* Save the consent status in prefs and initialize ads. Then navigate to the other activity
*/
private fun proceed(isPersonalized: Boolean, isInEu: Boolean = false) {
val consentInfo = ConsentInformation.getInstance(requireContext())
consentInfo.consentStatus = if (isPersonalized) ConsentStatus.PERSONALIZED else ConsentStatus.NON_PERSONALIZED
prefs.setCanShowPersonalizedAds(isPersonalized)
AdvertisingInitialization(requireContext(), prefs, isInEu)
(activity as LandingActivity).navigateToContentActivity()
}
如果用户在欧盟并且从未选择他想要个性化广告还是非个性化广告。我会将他转发到另一个片段,其中包含:
1个TextView(带有指向广告网络网页的可扩展字符串的描述),
2 个按钮,一个是“是的,我同意”,另一个是“不,谢谢”
然后我会保存他们的选择
consentInfo.consentStatus = if (isPersonalized) ConsentStatus.PERSONALIZED else ConsentStatus.NON_PERSONALIZED
prefs.setCanShowPersonalizedAds(isPersonalized)
每次我请求广告时,我都会这样做:
fun getAdRequest(isPersonalized: Boolean): AdRequest {
val adRequest: AdRequest
adRequest = if (isPersonalized) {
AdRequest.Builder().build()
} else {
val extras = Bundle()
extras.putString("npa", "1")
AdRequest.Builder()
.addNetworkExtrasBundle(AdMobAdapter::class.java, extras)
.build()
}
return adRequest
}
您可能已经注意到了 AdvertisingInitialization 类。我使用这个类将用户的选择转发到我使用中介的广告网络。部分代码如下所示:
init {
initAppLovin()
initAdColony()
initChartboost()
initIronSource()
initMoPub()
initUnityAds()
initVungle()
initInMobi()
MobileAds.initialize(context)
}
此处提供了有关每个实现的信息:https://developers.google.com/admob/android/eu-consent