我最近将屏幕转换为 Jetpack Compose,广告团队报告说,他们观察到广告展示次数大幅下降。我将 AdManagerAdView 封装在 Compose AndroidView 中,广告已成功加载并显示在屏幕上。但是当我调试时,我发现使用 Compose 实现的广告没有调用 onAdImpression。为了进行比较,我还有另一个屏幕仍在 XML/recyclerview 中,并且 onAdImpression 在 onAdLoaded 之后立即调用。我的撰写实现如下:
Column(
modifier = modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
val lifecycleState = LocalLifecycleOwner.current.lifecycle.observeAsState()
val context = LocalContext.current
val adView: AdManagerAdView = remember {
AdManagerAdView(context)
}
when (lifecycleState.value) {
Lifecycle.Event.ON_PAUSE -> {
adView.pause()
}
Lifecycle.Event.ON_RESUME -> {
adView.resume()
}
Lifecycle.Event.ON_DESTROY -> {
adView.destroy()
}
else -> {}
}
AndroidView(
factory = { context ->
val unitId = AdUtils.buildAdUnitId(context, adMetadata)
val params = AdUtils.buildAdParams(context, adMetadata)
val builder = AdManagerAdRequest.Builder()
params.keys.forEach { key ->
params[key]?.let { value ->
builder.addCustomTargeting(key, value)
}
}
adMetadata.advertisable?.url?.let {
builder.setContentUrl(it)
}
adView.apply {
setAdSizes(*adMetadata.adSizes)
adUnitId = unitId
importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
adListener = object : AdListener() {
override fun onAdLoaded() {
super.onAdLoaded()
Timber.d("ad loaded location ${adMetadata.location} postion ${adMetadata.position}")
}
override fun onAdFailedToLoad(adError: LoadAdError) {
super.onAdFailedToLoad(adError)
Timber.e("ad failed: message = ${adError.message}, cause = ${adError.cause}, response info = ${adError.responseInfo}")
}
override fun onAdImpression() {
super.onAdImpression()
Timber.d("onAdImpression location ${adMetadata.location} postion ${adMetadata.position}")
}
}
loadAd(builder.build())
}
},
modifier = Modifier
.width(Utils.findWidestAdSize(adMetadata.adSizes).dp)
.height(Utils.findHighestAdSize(adMetadata.adSizes).dp)
)
Text(
text = stringResource(id = R.string.adfree_ad_remove),
color = TextGrey,
textDecoration = TextDecoration.Underline,
fontSize = 14.sp,
fontFamily = FontFamily.Default,
textAlign = TextAlign.Center,
modifier = Modifier
.clickable {
onAdFreeClicked()
}
.padding(vertical = 8.dp, horizontal = 16.dp)
)
}
这意味着尽管用户看到了广告,但展示次数不算在内,公司也不会为此付费!
如何解决这个问题?
最佳答案
我发现 Kotlin slack 中针对 Jetpack Compose 中的 NativeAdView 提出了此解决方法,https://kotlinlang.slack.com/archives/CJLTWPH7S/p1664105063510709 ,我改进了一点。从 onAdLoaded 调用 adView.rootView.requestLayout()
解决了该问题,我现在看到 onAdImpression 在 onAdLoaded 之后立即调用。
adListener = object : AdListener() {
override fun onAdLoaded() {
super.onAdLoaded()
Timber.d("ad loaded location ${adMetadata.location} postion ${adMetadata.position}")
adView.rootView.requestLayout()
}
override fun onAdFailedToLoad(adError: LoadAdError) {
super.onAdFailedToLoad(adError)
Timber.e("ad failed: message = ${adError.message}, cause = ${adError.cause}, response info = ${adError.responseInfo}")
}
override fun onAdImpression() {
super.onAdImpression()
Timber.d("onAdImpression location ${adMetadata.location} postion ${adMetadata.position}")
}
}
关于android-jetpack-compose - 当 AdManagerAdView 与 Jetpack Compose 结合使用时,广告展示次数不计入在内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76100292/