原生广告

原生广告是通过平台本身的界面组件向用户展示的广告素材资源。这种广告使用您在构建布局时已经采用的同类视图进行展示,而且能以和周围视觉设计相称的形式呈现,让用户有浑然一体的使用体验。从代码编写的角度来说,这意味着当原生广告加载时,您的应用会收到一个包含其素材资源的 NativeAd 对象,然后就由此应用(而不是 Google 移动广告 SDK)负责展示它们了。

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

本页面主要介绍如何使用 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()

准备使用 NativeAd 格式

上述第一种方法负责为 NativeAd 格式准备 AdLoader

forNativeAd()
调用此方法会将 AdLoader 配置为请求原生广告。成功加载广告后,会调用监听器对象的 onNativeAdLoaded() 方法。

AdLoader 发出广告请求时,Google 会选择能使发布商收益最大化的广告,然后将该广告返回。

使用 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()
此方法会针对多个广告(最多 5 个)发送请求:

Java

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

Kotlin

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

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

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

返回的 Google 广告各不相同。预订型广告资源或第三方买方(包括为广告瀑布流中介或出价方配置的买方)投放的广告不保证具有唯一性。

回调

调用 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()

始终使用测试广告进行测试

在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。否则,可能会导致您的帐号被暂停。

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

ca-app-pub-3940256099942544/2247696110

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

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

何时请求广告

展示原生广告的应用完全可以在实际展示广告之前先行请求这些广告。在许多情况下,建议采用这种做法。例如,展示混合原生广告的项目列表可以加载整个列表的原生广告,因为知道一些广告仅在用户滚动浏览视图后才会展示,还有一些可能根本不会展示。

视频广告的硬件加速

若要在原生广告视图中成功展示视频广告,必须启用硬件加速

硬件加速默认处于启用状态,但某些应用可能会选择将其停用。对于您的应用,我们建议您为使用广告的 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 本身必须启用硬件加速。

显示 NativeAd

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