You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从AdMob v19迁移至v20时Native Ad代码报错求助

解决AdMob v19迁移到v20的原生广告代码适配问题

AdMob v20版本对原生广告API做了重大重构,移除了UnifiedNativeAd和UnifiedNativeAdView,改用全新的NativeAd和NativeAdView类,同时调整了广告视图绑定、加载回调的API,这就是你遇到大量符号/方法无法解析的原因。以下是针对性的代码适配方案:

一、替换导入依赖

删除原有的旧API导入,替换为v20+的新类:

// 移除这些废弃类
// import com.google.android.gms.ads.formats.UnifiedNativeAd;
// import com.google.android.gms.ads.formats.UnifiedNativeAdView;

// 添加新的原生广告API导入
import com.google.android.gms.ads.nativead.NativeAd;
import com.google.android.gms.ads.nativead.NativeAdView;
import com.google.android.gms.ads.AdError;
import com.google.android.gms.ads.nativead.MediaView;

二、修改广告加载逻辑

重构loadNativeAds方法,适配新的AdLoader回调和视图绑定规则:

public static void loadNativeAds(Activity activity, final View view) {
    final ViewGroup viewGroup = activity.findViewById(R.id.admob_native_container);
    final NativeAdView nativeAdView = activity.findViewById(R.id.native_ad_view);

    // 绑定广告视图组件(新API用setView替代原有的setXXXView方法)
    nativeAdView.setView(NativeAdView.HEADLINE_VIEW, nativeAdView.findViewById(R.id.primary));
    nativeAdView.setView(NativeAdView.BODY_VIEW, nativeAdView.findViewById(R.id.secondary));
    nativeAdView.setView(NativeAdView.CALL_TO_ACTION_VIEW, nativeAdView.findViewById(R.id.cta));
    nativeAdView.setView(NativeAdView.ICON_VIEW, nativeAdView.findViewById(R.id.icon));
    nativeAdView.setView(NativeAdView.ADVERTISER_VIEW, nativeAdView.findViewById(R.id.tertiary));
    // 媒体视图需强转为MediaView类型绑定
    nativeAdView.setMediaView((MediaView) nativeAdView.findViewById(R.id.media_view));

    AdLoader adLoader = new AdLoader.Builder(activity, activity.getString(R.string.admob_native_id))
            .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
                @Override
                public void onNativeAdLoaded(NativeAd nativeAd) {
                    populateNativeAdView(nativeAd, nativeAdView);
                    viewGroup.setVisibility(View.VISIBLE);
                    ((View) viewGroup.getParent().getParent()).setVisibility(View.VISIBLE);

                    if (view != null) {
                        view.setVisibility(View.GONE);
                    }
                }
            })
            .withAdListener(new com.google.android.gms.ads.AdListener() {
                @Override
                public void onAdFailedToLoad(AdError adError) {
                    // 可选:添加广告加载失败的兜底逻辑
                }
            })
            .build();

    if (BuildConfig.APPLICATION_ID.equals(PKG_APP)) {
        adLoader.loadAd(new AdRequest.Builder().build());
    }
}

三、重构广告填充方法

更新populateNativeAdView方法,适配新的NativeAd数据获取API:

public static void populateNativeAdView(NativeAd nativeAd, NativeAdView nativeAdView) {
    // 填充标题、正文、CTA按钮文本
    ((TextView) nativeAdView.getView(NativeAdView.HEADLINE_VIEW)).setText(nativeAd.getHeadline());
    ((TextView) nativeAdView.getView(NativeAdView.BODY_VIEW)).setText(nativeAd.getBody());
    ((TextView) nativeAdView.getView(NativeAdView.CALL_TO_ACTION_VIEW)).setText(nativeAd.getCallToAction());

    // 处理广告图标显示逻辑
    NativeAd.Image icon = nativeAd.getIcon();
    ImageView iconView = (ImageView) nativeAdView.getView(NativeAdView.ICON_VIEW);
    if (icon == null) {
        iconView.setVisibility(View.INVISIBLE);
    } else {
        iconView.setImageDrawable(icon.getDrawable());
        iconView.setVisibility(View.VISIBLE);
    }

    // 处理广告主信息显示逻辑
    TextView advertiserView = (TextView) nativeAdView.getView(NativeAdView.ADVERTISER_VIEW);
    if (nativeAd.getAdvertiser() == null) {
        advertiserView.setVisibility(View.INVISIBLE);
    } else {
        advertiserView.setText(nativeAd.getAdvertiser());
        advertiserView.setVisibility(View.VISIBLE);
    }

    // 将原生广告实例绑定到视图
    nativeAdView.setNativeAd(nativeAd);
}

核心API变化总结

  • 废弃UnifiedNativeAd → 替换为com.google.android.gms.ads.nativead.NativeAd
  • 废弃UnifiedNativeAdView → 替换为com.google.android.gms.ads.nativead.NativeAdView
  • 原setHeadlineView()/getHeadlineView()等方法 → 统一改为setView()/getView(),需传入对应视图类型常量(如NativeAdView.HEADLINE_VIEW)
  • 原forUnifiedNativeAd()加载回调 → 替换为forNativeAd(),回调接口改为NativeAd.OnNativeAdLoadedListener

内容的提问来源于stack exchange,提问作者ahmedhassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:07:52