原生广告

请选择平台Android iOS Flutter Unity

原生广告是通过平台原本就有的界面组件向用户呈现的广告素材资源。这种广告使用您在构建布局时已经采用的同类视图进行展示,而且能以和应用视觉设计相称的形式呈现,让用户有浑然一体的使用体验。

加载原生广告时,您的应用会收到一个包含其素材资源的广告对象,然后由应用(而不是 Google 移动广告 SDK)负责展示它们。

一般而言,要成功植入原生广告,就需要完成两步:使用 SDK 加载广告,然后在您的应用中展示广告内容。

本页介绍了如何使用 SDK 加载原生广告。 提示:如需详细了解原生广告,请参阅我们的原生广告指南

您还可以查看客户成功案例:案例研究 1案例研究 2

前提条件

务必用测试广告进行测试

在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。

对于在 Android 上投放的原生广告,加载测试广告最简便的方法就是使用下面的测试专用广告单元 ID:

ca-app-pub-3940256099942544/2247696110

该测试广告单元 ID 已经过专门配置,可确保每个请求返回的都是测试广告。您可以在自己应用的编码、测试和调试过程中使用该测试广告单元 ID。只需确保您会在发布应用前用自己的广告单元 ID 替换该测试广告单元 ID 即可。

如需详细了解 Google 移动广告 SDK 的测试广告如何运作,请参阅测试广告

加载广告

原生广告通过 AdLoader 类加载,该类有自己的 Builder 类,可在广告创建过程中对广告进行自定义。应用在构建 AdLoader 的过程中会向其添加监听器,以指定它准备接收哪些类型的原生广告。这样,AdLoader 就会只请求这些类型的广告。

构建 AdLoader

以下代码演示了如何构建可加载原生广告的 AdLoader

Java

// It is recommended to call AdLoader.Builder on a background thread.
new Thread(
        () -> {
          AdLoader adLoader =
              new AdLoader.Builder(context, "AD_UNIT_ID")
                  .forNativeAd(
                      new NativeAd.OnNativeAdLoadedListener() {
                        @Override
                        // The native ad loaded successfully. You can show the ad.
                        public void onNativeAdLoaded(@NonNull NativeAd nativeAd) {}
                      })
                  .withAdListener(
                      new AdListener() {
                        @Override
                        // The native ad load failed. Check the adError message for failure
                        // reasons.
                        public void onAdFailedToLoad(@NonNull LoadAdError adError) {}
                      })
                  // Use the NativeAdOptions.Builder class to specify individual options
                  // settings.
                  .withNativeAdOptions(new NativeAdOptions.Builder().build())
                  .build();
        })
    .start();

Kotlin

// It is recommended to call AdLoader.Builder on a background thread.
CoroutineScope(Dispatchers.IO).launch {
  val adLoader =
    AdLoader.Builder(context, "AD_UNIT_ID")
      .forNativeAd { nativeAd ->
        // The native ad loaded successfully. You can show the ad.
      }
      .withAdListener(
        object : AdListener() {
          override fun onAdFailedToLoad(adError: LoadAdError) {
            // The native ad load failed. Check the adError message for failure reasons.
          }
        }
      )
      // Use the NativeAdOptions.Builder class to specify individual options settings.
      .withNativeAdOptions(NativeAdOptions.Builder().build())
      .build()
}

AD_UNIT_ID 替换为您的测试设备 ID。

forNativeAd() 方法负责为 NativeAd 格式准备 AdLoader。当广告成功加载后,会调用监听器对象的 onNativeAdLoaded() 方法。

使用 AdLoader 设置 AdListener(可选)

创建 AdLoader 时,withAdListener 函数会为加载程序设置一个 AdListener。该方法将 AdListener 作为其唯一参数,当广告生命周期事件发生时,此参数会收到来自 AdLoader 的回调:

Java

adLoaderBuilder.withAdListener(
    // Override AdListener callbacks here.
    new AdListener() {});

Kotlin

adLoaderBuilder.withAdListener(
  // Override AdListener callbacks here.
  object : AdListener() {}
)

提出广告请求

构建完 AdLoader 后,就可以使用它来请求广告了。 用于加载广告的方法有两个:loadAd()loadAds()

loadAd()

此方法针对单个广告发送请求。

Java

adLoader.loadAd(new AdRequest.Builder().build());

Kotlin

adLoader.loadAd(AdRequest.Builder().build())

loadAds()

此方法针对多个广告(最多 5 个)发送请求:

Java

// Load three native ads.
adLoader.loadAds(new AdRequest.Builder().build(), 3);

Kotlin

// Load three native ads.
adLoader.loadAds(AdRequest.Builder().build(), 3)

这两个方法都将 AdRequest 对象作为第一个参数。这同样是横幅广告和插页式广告所使用的 AdRequest 类,您可以使用 AdRequest 类的方法添加定位信息,这一点与其他广告格式一样。

加载多个广告(可选)

loadAds() 方法还需要另外一个参数,即 SDK 应尝试为该请求加载的广告数量。此数量的上限为 5 个,而且无法保证 SDK 返回的广告数量一定等于所请求的广告数量。

返回的 Google 广告彼此之间都不同,但预留广告资源或第三方买家的广告不一定独一无二。

如果您使用中介,请勿使用 loadAds() 方法,因为涉及多个原生广告的请求不适用于配置为使用中介功能的广告单元 ID。

回调

调用 loadAd() 后,将对之前定义的监听器方法进行一次回调,以投放原生广告对象或报告错误。

调用 loadAds() 后,将进行多次此类回调(至少一次,但不超过请求的广告数量)。对于请求多个广告的应用,应在其回调实现代码中调用 AdLoader.isLoading(),以确定是否已完成加载过程。

下例展示了如何在 onNativeAdLoaded() 回调中检查 isLoading()

Java

adLoaderBuilder
    .forNativeAd(
        nativeAd -> {
          // This callback is invoked when a native ad is successfully loaded.
        })
    .build();

Kotlin

adLoaderBuilder
  .forNativeAd { nativeAd ->
    // This callback is invoked when a native ad is successfully loaded.
  }
  .build()

释放资源

请务必对已加载的原生广告使用 destroy() 方法。这样可以释放已使用的资源并防止内存泄漏。

验证 activity 的 onDestroy() 方法中是否销毁了所有 NativeAd 引用。

onNativeAdLoaded 回调中,请务必销毁将要取消引用的所有现有原生广告。

另一项关键检查是 activity 是否已销毁,如果已销毁,则对返回的广告调用 destroy() 并立即返回:

Java

nativeAd.destroy();

Kotlin

nativeAd.destroy()

最佳做法

加载广告时,请遵循以下规则。

  • 在列表中使用原生广告的应用应预缓存广告列表。

  • 预缓存广告时,请清除缓存并在 1 小时后重新加载。

  • 在第一个请求完成加载之前,请勿对 AdLoader 调用 loadAd()loadAds()
  • 将原生广告缓存限制为仅缓存所需内容。例如,在预缓存时,仅缓存屏幕上立即可见的广告。原生广告占用大量内存,缓存原生广告而不销毁会导致内存使用量过高。

  • 在不再使用原生广告时将其销毁。

针对视频广告启用硬件加速

为了确保视频广告在原生广告视图中成功展示,必须启用硬件加速

硬件加速默认处于启用状态,但有些应用可能会选择将其停用。如果您的应用停用了硬件加速,我们建议您为使用广告的 Activity 类启用硬件加速。

启用硬件加速

如果您的应用在全局级别启用硬件加速时无法正常运行,您也可以针对个别 activity 启用或停用硬件加速。如需启用或停用硬件加速,请针对 AndroidManifest.xml 中的 <application><activity> 元素使用 android:hardwareAccelerated 属性。以下示例展示了如何为整个应用启用硬件加速,但为一个 activity 停用硬件加速:

<application android:hardwareAccelerated="true">
    <!-- For activities that use ads, hardwareAcceleration should be true. -->
    <activity android:hardwareAccelerated="true" />
    <!-- For activities that don't use ads, hardwareAcceleration can be false. -->
    <activity android:hardwareAccelerated="false" />
</application>

如需详细了解用于控制硬件加速的选项,请参阅硬件加速指南。请注意,如果针对 activity 停用了硬件加速,那么将无法针对单个广告视图启用,因此必须针对 activity 本身启用硬件加速。

展示您的广告

加载广告后,剩下的工作就是将其展示给您的用户。请参阅我们的原生高级广告指南,了解具体方法。