横幅广告

横幅广告是占据应用部分布局的矩形广告。当用户与应用互动时,横幅广告会停留在屏幕上(锚定在屏幕顶部或底部),或在用户滚动时内嵌于内容中。横幅广告可以在一段时间后自动刷新。如需了解详情,请参阅 横幅广告概览

本指南介绍了如何开始使用 锚定自适应横幅广告,它可以使用您指定的广告宽度针对每种设备优化广告尺寸,从而最大限度地提升广告效果。

锚定自适应横幅广告是具有固定宽高比的广告,而不是常规固定尺寸广告。宽高比类似于业界标准 320x50。指定可用的全宽后,系统会为您返回适合该宽度且高度契合的广告。同一设备发出的请求的最佳高度不会改变,而且在广告刷新时,周围的视图也不需要移动。

前提条件

务必用测试广告进行测试

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

对于 Android 横幅广告,加载测试广告最简便的方法就是使用下面的专用测试广告单元 ID:

/6499/example/adaptive-banner

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

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

将 AdManagerAdView 添加到布局中

要展示横幅广告,首先要将 AdManagerAdView 放置在您希望用于展示广告的 ActivityFragment 的布局中:

Java

private AdSize getAdSize() {
  // Determine the screen width (less decorations) to use for the ad width.
  Display display = getWindowManager().getDefaultDisplay();
  DisplayMetrics outMetrics = new DisplayMetrics();
  display.getMetrics(outMetrics);

  float density = outMetrics.density;

  float adWidthPixels = adContainerView.getWidth();

  // If the ad hasn't been laid out, default to the full screen width.
  if (adWidthPixels == 0) {
    adWidthPixels = outMetrics.widthPixels;
  }

  int adWidth = (int) (adWidthPixels / density);
  return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, adWidth);
}

private void loadBanner() {
  
  // Create a new ad view.
  AdManagerAdView adView = new AdManagerAdView(this);
  adView.setAdSizes(getAdSize());
  adView.setAdUnitId("/6499/example/adaptive-banner");

  // Replace ad container with new ad view.
  adContainerView.removeAllViews();
  adContainerView.addView(adView);

  // Start loading the ad in the background.
  AdManagerAdRequest adRequest = new AdManagerAdRequest.Builder().build();
  adView.loadAd(adRequest);
}

Kotlin


// Determine the screen width (less decorations) to use for the ad width.
// If the ad hasn't been laid out, default to the full screen width.
private val adSize: AdSize
  get() {
    val display = windowManager.defaultDisplay
    val outMetrics = DisplayMetrics()
    display.getMetrics(outMetrics)

    val density = outMetrics.density

    var adWidthPixels = binding.adViewContainer.width.toFloat()
    if (adWidthPixels == 0f) {
      adWidthPixels = outMetrics.widthPixels.toFloat()
    }

    val adWidth = (adWidthPixels / density).toInt()
    return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, adWidth)
  }

private fun loadBanner() {
  
  // Create a new ad view.
  val adView = AdManagerAdView(this)
  adView.adSizes = adSize
  adView.adUnitId = "/6499/example/adaptive-banner"

  // Create an ad request.
  val adRequest = AdManagerAdRequest.Builder().build()

  // Start loading the ad in the background.
  adView.loadAd(adRequest)
}

加载广告

AdManagerAdView 创建好后,下一步是加载广告。此步骤可使用 AdManagerAdView 类中的 loadAd() 方法完成。这需要 AdManagerAdRequest 参数,其中包含有关单个广告请求的运行时信息,例如定位信息。

以下示例展示了如何通过 ActivityonCreate() 方法加载广告:

Java

private void loadBanner() {
  // Create a new ad view.
  adView = new AdManagerAdView(this);
  adView.setAdUnitId(AD_UNIT);
  adView.setAdSize(getAdSize());
  
  // Replace ad container with new ad view.
  adContainerView.removeAllViews();
  adContainerView.addView(adView);

  // Start loading the ad in the background.
  AdManagerAdRequest adRequest = new AdManagerAdRequest.Builder().build();
  adView.loadAd(adRequest);
}

Kotlin

private fun loadBanner() {
  // This is an ad unit ID for a test ad. Replace with your own banner ad unit ID.
  adView.adUnitId = "/6499/example/banner"
  adView.setAdSize(adSize)
  
  // Create an ad request.
  val adRequest = AdManagerAdRequest.Builder().build()

  // Start loading the ad in the background.
  adView.loadAd(adRequest)
}

如果您的广告加载失败,只要已将广告单元配置为刷新,就无需明确请求再次加载;Google 移动广告 SDK 会采用您在 Ad Manager网页界面中指定的任何刷新频率。如果您尚未启用刷新,则需要发出新的请求。

大功告成!您的应用现在就可以展示横幅广告了。

广告事件

若要进一步自定义您广告的行为,您可以在广告生命周期内加入许多事件,如加载、打开、关闭等等。您可以通过 AdListener 类监听这些事件。

如需将 AdListenerAdManagerAdView 搭配使用,请调用 setAdListener() 方法:

Java

AdManagerAdView.setAdListener(new AdListener() {
    @Override
    public void onAdClicked() {
      // Code to be executed when the user clicks on an ad.
    }

    @Override
    public void onAdClosed() {
      // Code to be executed when the user is about to return
      // to the app after tapping on an ad.
    }

    @Override
    public void onAdFailedToLoad(LoadAdError adError) {
      // Code to be executed when an ad request fails.
    }

    @Override
    public void onAdImpression() {
      // Code to be executed when an impression is recorded
      // for an ad.
    }

    @Override
    public void onAdLoaded() {
      // Code to be executed when an ad finishes loading.
    }

    @Override
    public void onAdOpened() {
      // Code to be executed when an ad opens an overlay that
      // covers the screen.
    }
});

Kotlin

AdManagerAdView.adListener = object: AdListener() {
    override fun onAdClicked() {
      // Code to be executed when the user clicks on an ad.
    }

    override fun onAdClosed() {
      // Code to be executed when the user is about to return
      // to the app after tapping on an ad.
    }

    override fun onAdFailedToLoad(adError : LoadAdError) {
      // Code to be executed when an ad request fails.
    }

    override fun onAdImpression() {
      // Code to be executed when an impression is recorded
      // for an ad.
    }

    override fun onAdLoaded() {
      // Code to be executed when an ad finishes loading.
    }

    override fun onAdOpened() {
      // Code to be executed when an ad opens an overlay that
      // covers the screen.
    }
}

AdListener 中每种可替换的方法均对应广告生命周期内的一个事件。

可替换的方法
onAdClicked() 记录广告获得的点击时,系统会调用 onAdClicked() 方法。
onAdClosed() 用户在查看广告的目标网址后返回应用时,系统会调用 onAdClosed() 方法。应用可以使用此方法恢复暂停的活动,或执行任何其他必要的操作,以做好互动准备。
onAdFailedToLoad() onAdFailedToLoad() 是唯一包含参数的方法。LoadAdError 类型的错误参数描述了发生的错误。如需了解详情,请参阅“调试广告加载错误”文档
onAdImpression() 记录广告获得的展示时,系统会调用 onAdImpression() 方法。
onAdLoaded() 广告加载完成后,系统会执行 onAdLoaded() 方法。如果您想推迟向 activity 或 fragment 添加 AdManagerAdView 的操作(例如,推迟到您确定广告会加载时),可以在此处操作。
onAdOpened() 广告打开覆盖屏幕的叠加层时,系统会调用 onAdOpened() 方法。

手动统计展示次数

手动展示次数统计仅适用于直接在 Ad Manager 中进行投放管理的直销广告系列和自家广告系列。它不应该用于补余广告或第三方广告联盟广告。如需了解详情,请参阅统计展示次数和点击次数

对于应在何时记录展示次数,如果您有特殊的条件,可以手动向 Ad Manager 发送展示 ping。为此,请在加载广告之前为手动展示启用 AdManagerAdRequest

Java

AdManagerAdRequest adRequest = new AdManagerAdRequest.Builder()
    .setManualImpressionsEnabled(true)
    .build();

Kotlin

val adRequest = AdManagerAdRequest.Builder()
    .setManualImpressionsEnabled(true)
    .build()

当您确定广告已成功返回并展示在屏幕上时,可以手动记录一次展示:

Java

AdManagerAdView.recordManualImpression();

Kotlin

AdManagerAdView.recordManualImpression()

应用事件

利用应用事件,您可以制作可向应用代码发送消息的广告。然后,应用可以根据这些消息执行操作。

您可以使用 AppEventListener 监听 Ad Manager 所特有的应用事件。这些事件可能会在广告生命周期内的任何时间发生,甚至在调用 onAdLoaded() 之前发生。

Java

public interface AppEventListener {
  void onAppEvent(String name, String info);
}

Kotlin

interface AppEventListener {
    fun onAppEvent(name: String, info: String)
}

当广告中发生应用事件时,系统会调用 void onAppEvent(String name, String info)。此接口可由您的 activity 或任何其他对象实现:

Java

import com.google.android.gms.ads.admanager.*;

public class BannerExample extends Activity implements AppEventListener {
}

Kotlin

import com.google.android.gms.ads.admanager.*

class BannerExample : Activity(), AppEventListener {
}

然后传递给 AdManagerAdView

Java

AdManagerAdView.setAppEventListener(this);

Kotlin

AdManagerAdView.appEventListener = this

以下示例展示了如何根据使用了颜色名称的应用事件更改应用的背景颜色:

Java

@Override
public void onAppEvent(String name, String info) {
  if ("color".equals(name)) {
    if ("green".equals(info)) {
      // Set background color to green.
    } else if ("blue".equals(info)) {
      // Set background color to blue.
    } else {
      // Set background color to black.
    }
  }
}

Kotlin

override fun onAppEvent(name: String?, info: String?) {
    if (name == "color") {
        when (info) {
            "green" -> {
                // Set background color to green.
            }
            "blue" -> {
                // Set background color to blue.
            }
            else -> {
                // Set background color to black.
            }
        }
    }
}

此外,以下是向监听器发送颜色应用事件消息的相应广告素材:

<html>
<head>
  <script src="//www.gstatic.com/afma/api/v1/google_mobile_app_ads.js"></script>
  <script>
    document.addEventListener("DOMContentLoaded", function() {
      // Send a color=green event when ad loads.
      admob.events.dispatchAppEvent("color", "green");

      document.getElementById("ad").addEventListener("click", function() {
        // Send a color=blue event when ad is clicked.
        admob.events.dispatchAppEvent("color", "blue");
      });
    });
  </script>
  <style>
    #ad {
      width: 320px;
      height: 50px;
      top: 0px;
      left: 0px;
      font-size: 24pt;
      font-weight: bold;
      position: absolute;
      background: black;
      color: white;
      text-align: center;
    }
  </style>
</head>
<body>
  <div id="ad">Carpe diem!</div>
</body>
</html>

有关 iOS API Demo 应用中应用事件的实现方式,请参阅 Ad Manager 应用事件示例。

Java Kotlin

适用于视频广告的硬件加速

为了在横幅广告视图中成功展示视频广告,必须启用硬件加速

硬件加速默认处于启用状态,但有些应用可能会选择停用它。如果您的应用出现这种情况,我们建议您为使用广告的 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 本身必须启用硬件加速。

其他资源

GitHub 上的示例

  • 锚定自适应横幅广告示例:Java | Kotlin

后续步骤

折叠式横幅广告

折叠式横幅广告最初作为较大的叠加层展示,带有一个用于将广告收起为较小尺寸的按钮。不妨考虑使用它来进一步优化您的性能。如需了解详情,请参阅折叠式横幅广告

内嵌自适应横幅广告

与锚定自适应横幅广告相比,内嵌自适应横幅广告是一种更大、更高的横幅广告。它们的高度可变,与设备屏幕一样高。对于在可滚动内容中放置横幅广告的应用,建议使用内嵌自适应横幅广告,而非锚定自适应横幅广告。如需了解详情,请参阅内嵌自适应横幅广告

浏览其他主题