使用自定义原生广告格式

除了系统定义的原生广告格式之外,Ad Manager 发布商还可以通过自行指定一系列素材资源来创建自己的原生广告格式。这类格式称为自定义原生广告 格式,可以用于 预订型广告。这样,发布商就可以向自己的应用传递任意结构化数据。这些广告由 NativeCustomFormatAd 对象表示。

加载自定义原生广告格式

本指南介绍了如何加载和展示自定义原生广告格式。

加载自定义原生广告

如需加载自定义原生广告,请执行以下操作:

  1. 在 NativeAdRequest 中将 NativeAdType.CUSTOM_NATIVE 类型作为广告类型。

  2. 设置自定义原生广告的格式 ID。

Kotlin

val adRequest =
  NativeAdRequest.Builder("AD_UNIT_ID", listOf(NativeAdType.CUSTOM_NATIVE))
    .setCustomFormatIds(listOf("CUSTOM_NATIVE_FORMAT_ID"))
    .build()

// Load the native ad with the ad request and callback.
NativeAdLoader.load(
  adRequest,
  object : NativeAdLoaderCallback {
    override fun onCustomNativeAdLoaded(customNativeAd: CustomNativeAd) {
      // TODO: Store the custom native ad.
    }

    override fun onAdFailedToLoad(adError: LoadAdError) {}
  },
)

Java

NativeAdRequest adRequest =
    new NativeAdRequest.Builder("AD_UNIT_ID", List.of(NativeAd.NativeAdType.CUSTOM_NATIVE))
        .setCustomFormatIds(Arrays.asList("CUSTOM_NATIVE_FORMAT_ID"))
        .build();

// Load the native ad with the ad request and callback.
NativeAdLoader.load(
    adRequest,
    new NativeAdLoaderCallback() {
      @Override
      public void onCustomNativeAdLoaded(@NonNull CustomNativeAd customNativeAd) {
        // TODO: Store the custom native ad.
      }

      @Override
      public void onAdFailedToLoad(@NonNull LoadAdError adError) {}
    });

自定义原生广告格式 ID

在 Ad Manager 界面的投放 下拉菜单中,前往原生 部分,即可找到用于标识自定义原生广告格式的格式 ID:

每个自定义原生广告格式 ID 都显示在其名称旁边。点击其中一个名称可以转到详细信息界面,该界面中会显示相应格式中各个字段的信息:

您可以在此界面中添加、修改和移除各个字段。请注意每个素材资源的名称 。在展示自定义原生广告格式时,该名称是用于获取每个素材资源数据的键。

展示自定义原生广告格式

自定义原生广告格式与系统定义的原生广告格式的不同之处在于:发布商有权定义自己用来制作广告的素材资源列表。因此,展示自定义原生广告格式的过程与展示系统定义的原生广告格式的过程在以下几个方面有所不同:

  1. 您可以通过 getText() 和 getImage() getter 获取文本和图片素材资源,这些 getter 会将字段名称作为参数。
  2. 由于没有专用的 ViewGroup 类可向 Google 注册,因此您需要手动记录展示次数和点击次数。
  3. 如果自定义原生广告不包含视频素材资源,则其媒体内容为 null。

以下示例展示了如何展示 CustomNativeAd:

Kotlin

private fun displayCustomNativeAd(customNativeAd: CustomNativeAd, context: Context) {
  // Render the text elements.

  // The `customNativeAdBinding` is the layout binding for the ad container that
  // contains all `CustomNativeAd` assets.
  customNativeAdBinding.headline.text = customNativeAd.getText("Headline")
  customNativeAdBinding.caption.text = customNativeAd.getText("Caption")

  // If the main asset is an image, render it with an ImageView.
  val imageView = ImageView(context)
  imageView.adjustViewBounds = true
  imageView.setImageDrawable(customNativeAd.getImage("MainImage")?.drawable)
  imageView.setOnClickListener { customNativeAd.performClick("MainImage") }
  customNativeAdBinding.mediaPlaceholder.addView(imageView)

  // Render the ad choices icon.
  renderAdChoices(customNativeAd)

  // Record an impression.
  customNativeAd.recordImpression()
}

Java

private void displayCustomNativeAd(CustomNativeAd customNativeAd, Context context) {
  // Render the text elements.

  // The `customNativeAdBinding` is the layout binding for the ad container that
  // contains all `CustomNativeAd` assets.
  if (customNativeAdBinding != null) {
    customNativeAdBinding.headline.setText(customNativeAd.getText("Headline"));
    customNativeAdBinding.caption.setText(customNativeAd.getText("Caption"));

    ImageView imageView = new ImageView(context);
    imageView.setAdjustViewBounds(true);
    imageView.setImageDrawable(customNativeAd.getImage("MainImage").getDrawable());
    imageView.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            customNativeAd.performClick("MainImage");
          }
        });
    customNativeAdBinding.mediaPlaceholder.addView(imageView);

    // Render the ad choices icon.
    renderAdChoices(customNativeAd);

    // Record an impression.
    customNativeAd.recordImpression();
  }
}

自定义原生广告格式的原生视频广告素材

创建自定义格式时,您可以选择让该格式支持视频。

在应用实现中,您可以使用 CustomNativeAd.getMediaContent() 获取媒体内容。然后,调用setMediaContent() 在媒体视图中设置媒体内容。 如果广告的媒体内容为 null,请制定替代方案,以便在没有视频的情况下展示广告。

以下示例会检查广告是否包含视频内容,如果广告不包含视频内容,则会显示图片来代替视频:

Kotlin

private fun displayVideoCustomNativeAd(customNativeAd: CustomNativeAd, context: Context) {
  // Check whether the custom native ad has video content.
  val mediaContent = customNativeAd.mediaContent
  if (mediaContent != null && mediaContent.hasVideoContent) {
    // Render the media content in a MediaView.
    val mediaView = MediaView(context)
    mediaView.mediaContent = mediaContent
    customNativeAdBinding.mediaPlaceholder.addView(mediaView)
  } else {
    // Fall back to other assets defined on your custom native ad.
    val imageView = ImageView(context)
    imageView.adjustViewBounds = true
    imageView.setImageDrawable(customNativeAd.getImage("MainImage")?.drawable)
    customNativeAdBinding.mediaPlaceholder.addView(imageView)
  }

  // Record an impression.
  customNativeAd.recordImpression()
}

Java

private void displayVideoCustomNativeAd(CustomNativeAd customNativeAd, Context context) {
  // Check whether the custom native ad has video content.
  MediaContent mediaContent = customNativeAd.getMediaContent();
  if (mediaContent != null && mediaContent.getHasVideoContent()) {
    // Render the media content in a MediaView.
    MediaView mediaView = new MediaView(context);
    mediaView.setMediaContent(mediaContent);
    customNativeAdBinding.mediaPlaceholder.addView(mediaView);
  } else {
    // Fall back to other assets defined on your custom native ad.
    ImageView imageView = new ImageView(context);
    imageView.setAdjustViewBounds(true);
    imageView.setImageDrawable(customNativeAd.getImage("MainImage").getDrawable());
    customNativeAdBinding.mediaPlaceholder.addView(imageView);
  }

  // Record an impression.
  customNativeAd.recordImpression();
}

如需详细了解如何自定义自定义原生广告的视频体验,请参阅视频广告。

呈现“广告选项”图标

为了支持 《数字服务法案》(DSA), 在欧洲经济区 (EEA) 内投放的预订型广告需要显示 “广告选项”图标,并提供指向 Google“关于此广告”页面的链接。 在实现自定义原生广告时,您需要负责呈现“广告选项”图标。我们建议您在呈现主要广告素材资源时,采取相应措施来呈现“广告选项”图标并设置其点击监听器。

以下示例假定您已在视图层次结构中定义 <ImageView /> 元素,以存放“广告选项”徽标。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView
        android:id="@+id/adChoices"
        android:layout_width="15dp"
        android:layout_height="15dp"
        android:adjustViewBounds="true"
        android:contentDescription="AdChoices icon." />
</LinearLayout>

以下示例会呈现“广告选项”图标并配置相应的点击行为。

Kotlin

private fun renderAdChoices(customNativeAd: CustomNativeAd) {
  // Render the AdChoices image.
  val adChoiceAsset = customNativeAd.getImage(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW)
  if (adChoiceAsset != null) {
    customNativeAdBinding.adchoices.setImageDrawable(adChoiceAsset.drawable)
    customNativeAdBinding.adchoices.visibility = View.VISIBLE
    customNativeAdBinding.adchoices.setOnClickListener {
      // Handle click. See the next section for more details.
      customNativeAd.performClick(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW)
    }
  } else {
    customNativeAdBinding.adchoices.visibility = View.GONE
  }
}

Java

private void renderAdChoices(CustomNativeAd customNativeAd) {
  // Render the AdChoices image.
  Image adChoiceAsset =
      customNativeAd.getImage(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW);
  if (adChoiceAsset != null) {
    if (customNativeAdBinding != null) {
      customNativeAdBinding.adchoices.setImageDrawable(adChoiceAsset.getDrawable());
      customNativeAdBinding.adchoices.setVisibility(View.VISIBLE);
      customNativeAdBinding.adchoices.setOnClickListener(
          new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              // Handle click.
              customNativeAd.performClick(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW);
            }
          });
    }
  } else {
    if (customNativeAdBinding != null) {
      customNativeAdBinding.adchoices.setVisibility(View.GONE);
    }
  }
}

记录展示次数和报告点击次数

您的应用负责记录展示次数,并将点击事件报告给 GMA Next-Gen SDK。

记录展示次数

如需记录自定义原生广告的展示次数,请调用广告的 recordImpression() 方法:

Kotlin

// Record an impression.
customNativeAd.recordImpression()

Java

// Record an impression.
customNativeAd.recordImpression();

如果您的应用意外地为同一广告调用该方法两次,SDK 会自动阻止为单个请求记录重复的展示次数。

报告点击次数

如需向 SDK 报告素材资源视图上发生了点击,请调用广告的 performClick() 方法。使用您在 Ad Manager 界面中定义的同一字符串提供被点击的素材资源的名称。

Kotlin

imageView.setOnClickListener { customNativeAd.performClick("MainImage") }

Java

imageView.setOnClickListener(
    new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        customNativeAd.performClick("MainImage");
      }
    });

请注意,您无需为与广告关联的每个视图调用此方法。如果您有另一个名为“Caption”的字段,该字段旨在显示,但用户不会点击或轻按该字段,则您的应用无需为该素材资源的视图调用 performClick。

响应自定义点击操作

当用户点击自定义格式广告时,SDK 会尝试按以下顺序执行三种可能的响应:

  1. 如果提供了 OnCustomClickListener,则调用该监听器。
  2. 对于每个广告的深层链接网址,尝试查找内容解析器,并启动第一个能够解析网址的内容解析器。
  3. 打开浏览器并前往广告的目标网址。

如需实现自定义点击操作,请提供 OnCustomClickListener:

Kotlin

customNativeAd.onCustomClickListener =
  object : OnCustomClickListener {
    override fun onCustomClick(assetName: String) {
      // Perform your custom action.
    }
  }

Java

customNativeAd.setOnCustomClickListener(
    new OnCustomClickListener() {
      @Override
      public void onCustomClick(@NonNull String assetName) {
        // Perform your custom action.
      }
    });

起初,自定义点击监听器的存在似乎很奇怪。毕竟,您的应用刚刚告知 SDK 发生了点击,那么 SDK 为何要反过来向应用报告该点击?

这种信息流很有用,原因有几个,但最重要的是,它让 SDK 能够控制对点击的响应。例如,它可以自动对已为广告素材设置的第三方跟踪网址执行 ping 操作,并在后台处理其他一些任务,而不需要任何额外的代码。