原生广告是通过平台原本就有的界面组件向用户呈现的广告素材资源。这种广告使用您在构建布局时已经采用的同类视图进行展示,而且能以和周围视觉设计相称的形式呈现,让用户有浑然一体的使用体验。具体到代码编写层面,这意味着当原生广告加载时,您的应用会收到一个包含其素材资源的 NativeAd
对象,然后就由此应用(而不是 Google 移动广告 SDK)负责展示它们了。
总的来说,要想成功植入原生广告,需要完成两部分工作:一是通过 SDK 加载广告,二是在您的应用中展示广告内容。本页将介绍如何使用 SDK 加载原生广告。
前提条件
- 导入 Google 移动广告 SDK(可以只导入其自身,也可以将其作为 Firebase 的一部分加以导入)。
加载广告
原生广告通过 AdLoader
类加载,该类有自己的 Builder
类,可在广告创建过程中对广告进行自定义。应用在构建 AdLoader
的过程中会向其添加监听器,以指定它准备接收哪些类型的原生广告。这样,AdLoader
就会只请求这些类型的广告。
构建 AdLoader
以下代码演示了如何构建可加载统一原生广告的 AdLoader
:
Java
AdLoader adLoader = new AdLoader.Builder(context, "ca-app-pub-3940256099942544/2247696110") .forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() { @Override public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) { // Show the ad. } }) .withAdListener(new AdListener() { @Override public void onAdFailedToLoad(int errorCode) { // 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") .forUnifiedNativeAd { ad : UnifiedNativeAd -> // Show the ad. } .withAdListener(object : AdListener() { override fun onAdFailedToLoad(errorCode: Int) { // 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()
为 UnifiedNativeAd 格式做准备
上例中首先调用的方法负责为 UnifiedNativeAd 格式准备 AdLoader
:
forUnifiedNativeAd()
- 调用此方法会将
AdLoader
配置为请求统一原生广告。当广告成功加载后,会调用监听器对象的onUnifiedNativeAdLoaded()
方法。
AdLoader
发出广告请求后,Google 会选择能使发布商收益最大化的广告,然后将该广告返回。
将 AdListener 与 AdLoader 配合使用
在创建上述 AdLoader
的过程中,withAdListener
函数会设置一个 AdListener
。
这是一个可选步骤。该方法将 AdListener
作为其唯一参数,当广告生命周期事件发生时,此参数会收到来自 AdLoader
的回调:
Java
.withAdListener(new AdListener() { // AdListener callbacks like OnAdFailedToLoad, OnAdOpened, OnAdClicked and // so on, can be overridden here. })
Kotlin
.withAdListener(object : AdListener() { // AdListener callbacks like OnAdFailedToLoad, OnAdOpened, OnAdClicked and // so on, can be overridden here. })
AdListener
对象处理原生广告的方式与处理横幅广告和插页式广告的方式有一个非常重要的区别。由于 AdLoader
本身就拥有因具体格式而异的监听器(即 UnifiedNativeAd.OnUnifiedNativeAdLoadedListener
),可在加载广告时使用,因此当原生广告成功加载时,并不会调用 AdListener
中的 onAdLoaded()
方法。
加载广告
构建完 AdLoader
后,就可以使用它来加载广告了。用于加载广告的方法有两个:loadAd()
和 loadAds()
。
loadAd()
方法针对单个广告发送请求:
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 返回的广告数量一定等于所请求的广告数量。如果调用 loadAds()
后返回了多个广告,则这些广告将互不相同。
调用 loadAd()
后,将对上面定义的监听器方法进行一次回调,以投放原生广告对象或报告错误。
调用 loadAds()
后,将进行多次此类回调(至少一次,但不超过请求的广告数量)。对于请求多个广告的应用,应在其回调实现代码中调用 AdLoader.isLoading()
,以确定是否已完成加载过程。
下例展示了如何在 onUnifiedNativeAdLoaded()
回调中检查 isLoading()
:
Java
final AdLoader adLoader = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110") .forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() { @Override public void onUnifiedNativeAdLoaded(UnifiedNativeAd ad) { ... // 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") .forUnifiedNativeAd { ... // 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)
务必用测试广告进行测试
在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。否则,可能会导致您的帐号被暂停。
对于在 Android 上投放的原生高级广告,加载测试广告最简便的方法就是使用下面的测试专用广告单元 ID:
ca-app-pub-3940256099942544/2247696110
该测试广告单元 ID 已经过专门配置,可确保每个请求返回的都是测试广告。您可以在自己应用的编码、测试和调试过程中随意使用该测试广告单元 ID。只是一定要在发布应用前用您自己的广告单元 ID 替换该测试广告单元 ID。
如需详细了解移动广告 SDK 的测试广告如何运作,请参阅测试广告。
何时请求广告
展示原生广告的应用完全可以在实际展示广告之前先行请求这些广告。在许多情况下,推荐采取这种做法。例如,如果某款应用展示一个商品清单,其中会夹杂一些原生广告,那么该应用就可以加载整个清单中的原生广告,因为它知道一些广告仅在用户滚动浏览视图后才会展示,还有一些可能根本不会展示。
展示 UnifiedNativeAd
加载广告后,剩下的工作就是将其展示给您的用户。请参阅我们的原生高级广告指南,了解具体方法。