原生高级广告

展示 NativeAd

加载原生广告时,Google 移动广告 SDK 会调用相应广告格式的监听器。然后,就由您的应用负责展示广告,尽管不一定要立即展示广告。为了更轻松地展示系统定义的广告格式,SDK 提供了一些实用资源,如下所述。

NativeAdView

对于 NativeAd 格式,有对应的 NativeAdView 类。此类是一个 ViewGroup,发布商应将其用作 NativeAd 的根。一个 NativeAdView 对应于一个原生广告。凡是用来展示此广告素材资源的视图(例如,展示屏幕截图素材资源的 ImageView),均应是 NativeAdView 对象的子对象。

对于使用 LinearLayout 展示素材资源视图的原生广告,其视图层次结构可能如下所示:

<com.google.android.gms.ads.nativead.NativeAdView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <LinearLayout
    android:orientation="vertical"
    ... >
        <LinearLayout
        android:orientation="horizontal"
        ... >
          <ImageView
           android:id="@+id/ad_app_icon"
           ... />
          <TextView
            android:id="@+id/ad_headline"
            ... />
         </LinearLayout>


         // Other assets such as image or media view, call to action, etc follow.
         ...
    </LinearLayout>
</com.google.android.gms.ads.nativead.NativeAdView>

下例就创建了一个 NativeAdView 并用 NativeAd 填充它:

Java

AdLoader.Builder builder = new AdLoader.Builder(this, "AD_UNIT_ID")
    .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
        @Override
        public void onNativeAdLoaded(NativeAd nativeAd) {
            // Assumes you have a placeholder FrameLayout in your View layout
            // (with id fl_adplaceholder) where the ad is to be placed.
            FrameLayout frameLayout =
                findViewById(R.id.fl_adplaceholder);
            // Assumes that your ad layout is in a file call native_ad_layout.xml
            // in the res/layout folder
            NativeAdView adView = (NativeAdView) getLayoutInflater()
                .inflate(R.layout.native_ad_layout, null);
            // This method sets the text, images and the native ad, etc into the ad
            // view.
            populateNativeAdView(nativeAd, adView);
            frameLayout.removeAllViews();
            frameLayout.addView(adView);
        }
});

Kotlin

val builder = AdLoader.Builder(this, "AD_UNIT_ID")
    .forNativeAd { nativeAd ->
        // Assumes that your ad layout is in a file call native_ad_layout.xml
        // in the res/layout folder
        val adView = layoutInflater
                .inflate(R.layout.native_ad_layout, null) as NativeAdView
        // This method sets the text, images and the native ad, etc into the ad
        // view.
        populateNativeAdView(nativeAd, adView)
        // Assumes you have a placeholder FrameLayout in your View layout
        // (with id ad_frame) where the ad is to be placed.
        ad_frame.removeAllViews()
        ad_frame.addView(adView)
    }

请注意,指定原生广告的所有素材资源都应在 NativeAdView 布局内呈现。当原生素材资源在原生广告视图布局之外呈现时,Google 移动广告 SDK 会尝试记录一条警告。

广告视图类还提供了用于注册每项素材资源所用视图的方法,以及一个用于注册 NativeAd 对象本身的方法。如果以这种方式注册视图,SDK 就可以自动处理诸如以下任务:

  • 记录点击
  • 在第一个像素显示在屏幕上时记录展示次数
  • 为原生补余广告广告素材 显示广告选择叠加层 - 目前仅面向部分发布商提供

“广告选择”叠加层

当返回补余广告时,SDK 会将广告选择叠加层作为广告视图添加。如果您的应用使用原生补余广告,请在原生广告视图的首选角中留出空间,用于展示自动插入的广告选择徽标。此外,广告选择叠加层一定要显眼易见,因此请选择适当的背景颜色和图片。如需详细了解叠加层的外观和功能,请参阅程序化原生广告植入指南

程序化原生广告的广告标示

在展示程序化原生广告时,您必须展示广告标示,以指明该视图是广告。请参阅我们的政策指南了解详情。

代码示例

以下是展示原生广告的步骤:

  1. 创建 NativeAdView 类的实例。
  2. 对于要展示的每个广告素材资源:
    1. 使用广告对象中的素材资源填充素材资源视图。
    2. ViewGroup 类注册该素材资源视图。
  3. 如果您的原生广告布局包含大型媒体素材资源,请注册 MediaView
  4. ViewGroup 类注册广告对象。

以下是一个显示 NativeAd 的示例函数:

Java

private void displayNativeAd(ViewGroup parent, NativeAd ad) {

    // Inflate a layout and add it to the parent ViewGroup.
    LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    NativeAdView adView = (NativeAdView) inflater
            .inflate(R.layout.ad_layout_file, parent);

    // Locate the view that will hold the headline, set its text, and call the
    // NativeAdView's setHeadlineView method to register it.
    TextView headlineView = adView.findViewById<TextView>(R.id.ad_headline);
    headlineView.setText(ad.getHeadline());
    adView.setHeadlineView(headlineView);

    ...
    // Repeat the above process for the other assets in the NativeAd
    // using additional view objects (Buttons, ImageViews, etc).
    ...

    // If the app is using a MediaView, it should be
    // instantiated and passed to setMediaView. This view is a little different
    // in that the asset is populated automatically, so there's one less step.
    MediaView mediaView = (MediaView) adView.findViewById(R.id.ad_media);
    adView.setMediaView(mediaView);

    // Call the NativeAdView's setNativeAd method to register the
    // NativeAdObject.
    adView.setNativeAd(ad);

    // Ensure that the parent view doesn't already contain an ad view.
    parent.removeAllViews();

    // Place the AdView into the parent.
    parent.addView(adView);
}

Kotlin

fun displayNativeAd(parent: ViewGroup, ad: NativeAd) {

    // Inflate a layout and add it to the parent ViewGroup.
    val inflater = parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)
            as LayoutInflater
    val adView = inflater.inflate(R.layout.ad_layout_file, parent) as NativeAdView

    // Locate the view that will hold the headline, set its text, and use the
    // NativeAdView's headlineView property to register it.
    val headlineView = adView.findViewById<TextView>(R.id.ad_headline)
    headlineView.text = ad.headline
    adView.headlineView = headlineView

    ...
    // Repeat the above process for the other assets in the NativeAd using
    // additional view objects (Buttons, ImageViews, etc).
    ...

    val mediaView = adView.findViewById<MediaView>(R.id.ad_media)
    adView.mediaView = mediaView

    // Call the NativeAdView's setNativeAd method to register the
    // NativeAdObject.
    adView.setNativeAd(ad)

    // Ensure that the parent view doesn't already contain an ad view.
    parent.removeAllViews()

    // Place the AdView into the parent.
    parent.addView(adView)
}

以下是各项任务:

  1. 膨胀布局

    Java

    LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    NativeAdView adView = (NativeAdView) inflater
            .inflate(R.layout.ad_layout_file, parent);
    

    Kotlin

    val inflater = parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)
            as LayoutInflater
    val adView = inflater.inflate(R.layout.ad_layout_file, parent) as NativeAdView
    

    此代码会扩充一个 XML 布局(其中包含用于展示原生广告的视图),然后找到对 NativeAdView 的引用。请注意,如果您的 fragment 或 activity 中有现有的 NativeAdView,您也可以重复使用它;您甚至可以在不使用布局文件的情况下动态创建实例。

  2. 填充和注册资源视图

    下面的示例代码会找到用于显示标题的视图,使用广告对象提供的字符串素材资源设置视图的文字,然后向 NativeAdView 对象注册该视图:

    Java

    TextView headlineView = adView.findViewById<TextView>(R.id.ad_headline);
    headlineView.setText(ad.getHeadline());
    adView.setHeadlineView(headlineView);
    

    Kotlin

    val headlineView = adView.findViewById<TextView>(R.id.ad_headline)
    headlineView.text = ad.headline
    adView.headlineView = headlineView
    

    对于应用要展示的原生广告对象提供的每项素材资源,都应为其重复上述过程,即找到该视图、设置其值并向广告视图类注册它。

  3. 处理点击

    请勿在原生广告视图之上或内部的任何视图中实现任何自定义点击处理程序。如需自行观察点击事件,请使用广告监听器

    只要您按上一部分所述正确填充和注册素材资源视图,该 SDK 就会处理广告视图素材资源获得的点击。

    以下是一个使用广告监听器观察点击事件的示例:

    Java

    AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
        ...
        .withAdListener(new AdListener() {
            @Override
            public void onAdFailedToLoad(LoadAdError adError) {
                // Handle the failure by logging, altering the UI, and so on.
            }
            @Override
            public void onAdClicked() {
                // Log the click event or other custom behavior.
            }
        })
        .build();
    

    Kotlin

    val adLoader = AdLoader.Builder(this, "/6499/example/native")
        ...
        .withAdListener(object : AdListener() {
            override fun onAdFailedToLoad(adError: LoadAdError) {
                // Handle the failure by logging, altering the UI, and so on.
            }
        })
        .build()
    
  4. 注册 MediaView

    如果您想在原生广告的布局中添加主图片素材资源,则必须使用 MediaView 素材资源,而不是 ImageView 素材资源。

    MediaView 是一个专门用于展示主媒体素材资源(视频或图片)的 View

    MediaView 可以在 XML 布局中定义,也可以动态构建。就像所有其他素材资源视图一样,应该将其放在 NativeAdView 的视图层次结构中。使用 MediaView 的应用必须向 NativeAdView 注册它:

    Java

    MediaView mediaView = adView.findViewById(R.id.ad_media);
    adView.setMediaView(mediaView);
    

    Kotlin

    adView.mediaView = adView.findViewById<MediaView>(R.id.ad_media)
    

    与所有素材资源视图一样,媒体视图需要填充其内容。为此,请使用 getMediaContent() 方法检索可传递到 MediaView媒体内容。以下代码段用于为媒体视图设置媒体内容:

    Java

    mediaView.setMediaContent(nativeAd.getMediaContent());
    

    Kotlin

    mediaView.mediaContent = nativeAd.mediaContent
    

    ImageScaleType

    MediaView 类在显示图片时具有 ImageScaleType 属性。如果要在 MediaView 中更改图片的缩放方式,请使用 MediaViewsetImageScaleType() 方法设置相应的 ImageView.ScaleType

    Java

    mediaView.setImageScaleType(ImageView.ScaleType.CENTER_CROP);
    

    Kotlin

    mediaView.imageScaleType = ImageView.ScaleType.CENTER_CROP
    

    MediaContent

    MediaContent 类包含与原生广告的媒体内容相关的数据,媒体内容则通过 MediaView 类展示。使用 MediaContent 实例设置 MediaView mediaContent 属性时:

    • 如果有视频素材资源可用,则系统会对其进行缓冲,并开始在 MediaView 内播放。您可以通过检查 hasVideoContent() 来判断是否有视频素材资源可用。

    • 如果广告不包含视频素材资源,系统会改为下载 mainImage 素材资源,并将其放置在 MediaView 内。

    默认情况下,mainImage 是第一个下载的图片素材资源。如果使用了 setReturnUrlsForImageAssets(true),则 mainImagenull,您必须将 mainImage 属性设置为您手动下载的图片。请注意,仅在没有视频素材资源可用时,系统才会使用此图片。

  5. 注册原生广告对象

    最后一步是向负责展示原生广告对象的视图注册该对象:

    Java

    adView.setNativeAd(ad);
    

    Kotlin

    adView.setNativeAd(ad)
    

销毁广告

当完成原生广告展示后,您应将其销毁,以便系统正确地对广告进行垃圾回收处理。

Java

nativeAd.destroy();
        .inflate(R.layout.ad_layout_file, parent);

Kotlin

nativeAd.destroy()

测试原生广告代码

直销广告

如果您想测试直销原生广告的呈现效果,可以使用此 Ad Manager 广告单元 ID:

/6499/example/native

它已配置为投放示例应用安装广告和内容广告以及包含以下素材资源的自定义原生广告格式:

  • 标题(文字)
  • 主图片(图片)
  • 图片说明(文字)

自定义原生广告格式的模板 ID 为 10063170

原生补余广告

Ad Exchange 补余广告目前仅面向部分发布商提供。要测试原生补余广告的行为,请使用此 Ad Manager 广告单元:

/6499/example/native-backfill

它投放包含“广告选择”叠加层的示例应用安装广告和内容广告。

在实际投放前,请务必更新代码,使其引用您的实际广告单元 ID 和模板 ID。

GitHub 上的示例

原生广告的完整植入示例:

Java Kotlin

后续步骤

请浏览以下主题: