android-jetpack-compose - 当 AdManagerAdView 与 Jetpack Compose 结合使用时,广告展示次数不计入在内

标签 android-jetpack-compose google-mobile-ads

我最近将屏幕转换为 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/

相关文章:

kotlin - 如何在 jetpack Compose 中将输入类型设置为整数?

android - LazyColumn 中每个项目的状态提升

使用 Admob 实现多个原生广告的 Flutter

java - Android 8.1 无法获取提供商 com.google.android.gms.ads.MobileAds!!!应用程序崩溃

flutter - 如何在不使用 admob 的情况下在 flutter 中添加广告?

flutter - 我可以禁用 Flutter Web 的特定依赖项吗?

java - MobileAds.getRequestConfiguration 未解析的引用

android - 如何在jetpack compose中将文本定义为h1?

android - 如何在 android compose 中创建 OTP 布局?

kotlin - 如何在 jetpack compose 中将光标从一个文本字段传递到另一文本字段?