ネイティブ広告

原生广告是通过平台原生的界面组件向用户呈现的广告素材资源。它们使用您在构建布局时使用的相同类型的视图展示,并且可以设置格式,使之契合应用的视觉设计。

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

一般来说,要成功植入原生广告,就需要完成两部分工作:使用 SDK 加载广告,然后在您的应用中展示广告内容。

本页介绍了如何使用 SDK 加载 原生广告

前提条件

务必用测试广告进行测试

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

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

ca-app-pub-3940256099942544/2247696110

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

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

加载广告

原生广告使用 AdLoader 类加载,该类有自己的 Builder 类,可在广告制作过程中对其进行自定义。应用在构建 AdLoader 时向其添加监听器,即可指定它准备接收哪些类型的原生广告。然后,AdLoader 将仅请求这些类型。

构建 AdLoader

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

Java

AdLoader adLoader = new AdLoader.Builder(context, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
        @Override
        public void onNativeAdLoaded(NativeAd nativeAd) {
            // Show the ad.
        }
    })
    .withAdListener(new AdListener() {
        @Override
        public void onAdFailedToLoad(LoadAdError adError) {
            // Handle the failure by logging, altering the UI, and so on.
        }
    })
    .withNativeAdOptions(new NativeAdOptions.Builder()
            // Methods in the NativeAdOptions.Builder class can be
            // used here to specify individual options settings.
            .build())
    .build();

Kotlin

val adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd { ad : NativeAd ->
        // Show the ad.
    }
    .withAdListener(object : AdListener() {
        override fun onAdFailedToLoad(adError: LoadAdError) {
            // Handle the failure by logging, altering the UI, and so on.
        }
    })
    .withNativeAdOptions(NativeAdOptions.Builder()
            // Methods in the NativeAdOptions.Builder class can be
            // used here to specify individual options settings.
            .build())
    .build()

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

使用 AdLoader 设置 AdListener(可选)

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

Java

.withAdListener(new AdListener() {
    // AdListener callbacks can be overridden here.
})

Kotlin

.withAdListener(object : AdListener() {
    // AdListener callbacks can be overridden here.
})

提出广告请求

构建完 AdLoader 后,您就可以使用它来请求广告了。 可以通过两种方法实现此目的:loadAd()loadAds()

loadAd()

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

Java

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

Kotlin

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

loadAds()

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

Java

adLoader.loadAds(new AdRequest.Builder().build(), 3);

Kotlin

adLoader.loadAds(AdRequest.Builder().build(), 3)

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

加载多个广告(可选)

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

返回的 Google 广告各不相同,但来自预订型广告资源或第三方买方的广告不一定是唯一的。

如果您使用的是中介功能,请不要使用 loadAds() 方法,因为针对多个原生广告的请求目前不适用于已为中介配置的广告单元 ID。

回调

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

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

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

Java

final AdLoader adLoader = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
        .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
    @Override
    public void onNativeAdLoaded(NativeAd nativeAd) {
        ...
        // some code that displays the ad.
        ...
        if (adLoader.isLoading()) {
            // The AdLoader is still loading ads.
            // Expect more adLoaded or onAdFailedToLoad callbacks.
        } else {
            // The AdLoader has finished loading ads.
        }
    }
}).build();
adLoader.loadAds(new AdRequest.Builder().build(), 3);

Kotlin

lateinit var adLoader: AdLoader
...
adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd {
        ...
        // some code that displays the ad.
        ...
        if (adLoader.isLoading) {
            // The AdLoader is still loading ads.
            // Expect more adLoaded or onAdFailedToLoad callbacks.
        } else {
            // The AdLoader has finished loading ads.
        }
    }.build()
adLoader.loadAds(AdRequest.Builder().build(), 3)

释放资源

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

确保在 activity 的 onDestroy() 方法中销毁所有 NativeAd 引用。

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

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

Java

final AdLoader adLoader = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
        .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
    @Override
    public void onNativeAdLoaded(NativeAd nativeAd) {
        // If this callback occurs after the activity is destroyed, you
        // must call destroy and return or you may get a memory leak.
        // Note `isDestroyed()` is a method on Activity.
        if (isDestroyed()) {
            nativeAd.destroy();
            return;
        }
        ...
    }
}).build();

Kotlin

lateinit var adLoader: AdLoader
...
adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd { nativeAd ->
        // If this callback occurs after the activity is destroyed, you
        // must call destroy and return or you may get a memory leak.
        // Note `isDestroyed` is a method on Activity.
        if (isDestroyed) {
            nativeAd.destroy()
            return@forNativeAd
        }
        ...
    }.build()

最佳实践

加载广告时请遵循这些规则。

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

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

  • 在第一个请求完成加载之前,请勿对 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 本身必须启用硬件加速。

展示您的广告

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