Banner Ads

横幅广告会占据应用布局中的一处位置,要么是设备屏幕的顶部,要么是底部。这类广告会在用户与应用互动时停留在屏幕上,并且可在一段时间后自动刷新。如果您刚开始接触移动广告,不妨先从横幅广告着手。

本指南介绍了如何将 Ad Manager 横幅广告植入到 Android 应用中。除了提供代码段和操作说明之外,本指南还介绍了如何正确地设置横幅广告的尺寸,并给出了其他资源的链接。

前提条件

向布局中添加 PublisherAdView

要展示横幅广告,首先要将 PublisherAdView 放置到您希望用于展示广告的 ActivityFragment 的布局中。最简单的放置方法是将其添加到相应的 XML 布局文件中。下例展示了某一 Activity 的 PublisherAdView

# main_activity.xml
...
  <com.google.android.gms.ads.doubleclick.PublisherAdView
      xmlns:ads="http://schemas.android.com/apk/res-auto"
      android:id="@+id/publisherAdView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerHorizontal="true"
      android:layout_alignParentBottom="true"
      ads:adSize="BANNER"
      ads:adUnitId="/6499/example/banner">
  </com.google.android.gms.ads.doubleclick.PublisherAdView>
...

请注意设置以下必需属性:

  • ads:adSize - 将此属性设置为要使用的广告尺寸。如果您不想使用该常量定义的标准尺寸,可改为设置自定义尺寸。有关详情,请参阅下面的“横幅广告尺寸”部分
  • ads:adUnitId - 将此属性设置为您应用中用于展示广告的广告单元所用的唯一标识符。如果您要在不同的 Activity 中展示横幅广告,则其中每个都需要一个广告单元。

另外,您也可以通过编程方式创建 PublisherAdView

Java

PublisherAdView adView = new PublisherAdView(this);
adView.setAdSizes(AdSize.BANNER);
adView.setAdUnitId("/6499/example/banner");
// TODO: Add adView to your view hierarchy.

Kotlin

val adView = PublisherAdView(this)
adView.adSizes = AdSize.BANNER
adView.adUnitId = "/6499/example/banner"
// TODO: Add adView to your view hierarchy.

务必用测试广告进行测试

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

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

/6499/example/banner

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

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

加载广告

PublisherAdView 放置好后,下一步是加载广告。广告加载是使用 PublisherAdView 类中的 loadAd() 方法完成的。此方法需要一个 PublisherAdRequest 参数,该参数中包含关于单个广告请求的运行时信息(如定位信息)。

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

MainActivity(节选)

Java

package ...

import ...
import com.google.android.gms.ads.doubleclick.PublisherAdRequest;
import com.google.android.gms.ads.doubleclick.PublisherAdView;

public class MainActivity extends AppCompatActivity {
    private PublisherAdView mPublisherAdView;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mPublisherAdView = findViewById(R.id.publisherAdView);
        PublisherAdRequest adRequest = new PublisherAdRequest.Builder().build();
        mPublisherAdView.loadAd(adRequest);
    }
}

Kotlin

package ...

import ...
import com.google.android.gms.ads.doubleclick.PublisherAdRequest
import com.google.android.gms.ads.doubleclick.PublisherAdView

class MainActivity : AppCompatActivity() {

    lateinit var mPublisherAdView : PublisherAdView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mPublisherAdView = findViewById(R.id.publisherAdView)
        val adRequest = PublisherAdRequest.Builder().build()
        mPublisherAdView.loadAd(adRequest)
    }
}

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

广告事件

要进一步自定义广告的行为,可以从广告生命周期内的一些事件(例如加载、打开、关闭等等)着手。您可以通过 AdListener 类监听这些事件。

要将 AdListener 用于 PublisherAdView,只需调用 setAdListener() 方法即可:

Java

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

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

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

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

    @Override
    public void onAdLeftApplication() {
        // Code to be executed when the user has left the app.
    }

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

Kotlin

mPublisherAdView.adListener = object: AdListener() {
    override fun onAdLoaded() {
        // Code to be executed when an ad finishes loading.
    }

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

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

    override fun onAdClicked() {
        // Code to be executed when the user clicks on an ad.
    }

    override fun onAdLeftApplication() {
        // Code to be executed when the user has left the app.
    }

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

AdListener 中每个可覆盖的方法对应着广告生命周期内的一个事件。

可覆盖的方法
onAdLoaded() 广告加载完成后,系统会执行 onAdLoaded() 方法。例如,如果您想将为 Activity 或 Fragment 添加 PublisherAdView 的操作推迟到您确定广告会加载时再执行,就可以通过此方法做到。
onAdFailedToLoad() onAdFailedToLoad() 是唯一包含参数的方法。errorCode 参数用于指明发生的是何种类型的失败。这些可能的类型值在 PublisherAdRequest 类中以常量的形式指定:
  • ERROR_CODE_INTERNAL_ERROR - 内部出现问题;例如,收到广告服务器的无效响应。
  • ERROR_CODE_INVALID_REQUEST - 广告请求无效;例如,广告单元 ID 不正确。
  • ERROR_CODE_NETWORK_ERROR - 由于网络连接问题,广告请求失败。
  • ERROR_CODE_NO_FILL - 广告请求成功,但由于缺少广告资源,未返回广告。
onAdOpened() 用户点按广告时,系统会调用此方法。
onAdLeftApplication() 此方法在 onAdOpened() 之后调用,具体是在用户点击打开其他应用(例如 Google Play),从而在后台运行当前应用时调用。
onAdClosed() 用户在查看了广告的目标网址后返回应用时,系统会调用此方法。应用可以使用此方法恢复暂停的活动,或执行任何其他必要的操作,以做好互动准备。

下表列出了标准的横幅广告尺寸。

尺寸(宽 x 高,以 dp 为单位) 说明 适用范围 AdSize 常量
320x50 横幅广告 手机和平板电脑 BANNER
320x100 大型横幅广告 手机和平板电脑 LARGE_BANNER
300x250 IAB 中矩形 手机和平板电脑 MEDIUM_RECTANGLE
468x60 IAB 全尺寸横幅广告 平板电脑 FULL_BANNER
728x90 IAB 页首横幅广告 平板电脑 LEADERBOARD
提供的宽度 x 自适应高度 自适应横幅广告 手机和平板电脑
屏幕宽度 x 32|50|90 智能横幅广告 手机和平板电脑 SMART_BANNER
详细了解自适应横幅广告(旨在取代智能横幅广告)。

要自定义横幅广告尺寸,请设置所需的 AdSize,如下所示:

Java

AdSize adSize = new AdSize(300, 50);

Kotlin

val adSize = AdSize(300, 50)

自定义广告尺寸

除了标准广告单元之外,Google Ad Manager 允许您在应用中投放任意尺寸的广告单元。为广告请求设定的广告尺寸(宽度、高度)应与应用中所展示的广告视图(下例中的 PublisherAdView)的尺寸相匹配。

示例:

Java

// Define custom AdSize of 250x250 for PublisherAdView

AdSize customAdSize = new AdSize(250, 250);
PublisherAdView adView = new PublisherAdView(this);
adView.setAdSizes(customAdSize);

Kotlin

// Define custom AdSize of 250x250 for PublisherAdView

val customAdSize = AdSize(250, 250)
val adView = PublisherAdView(this)
adView.setAdSizes(customAdSize)

有关 Android API Demo 应用中自定义广告尺寸的实现方式,请参阅 Ad Manager 多个广告尺寸示例

多个广告尺寸

Ad Manager 允许您指定多个可能适合投放到 PublisherAdView 的广告尺寸。在 SDK 中实现此功能之前,请创建一个订单项,定位到关联了多个不同尺寸广告素材的同一广告单元。

在您的应用中,只需将多个 AdSize 参数传递到 setAdSizes 即可:

Java

PublisherAdView adView = new PublisherAdView(this);
adView.setAdSizes(AdSize.BANNER, new AdSize(120, 20), new AdSize(250, 250));

Kotlin

val adView = PublisherAdView(this)
adView.setAdSizes(AdSize.BANNER, AdSize(120, 20), AdSize(250, 250))

如果 PublisherAdView 在刷新时改变了尺寸,您的布局应该能够自动适应新的尺寸。

如果需要为应用即时更改支持的广告尺寸,只需使用新的尺寸列表调用 setAdSizes 即可。

Java

// Drop support for 120x20 ad size.
adView.setAdSizes(AdSize.BANNER, new AdSize(250, 250));

Kotlin

// Drop support for 120x20 ad size.
adView.setAdSizes(AdSize.BANNER, AdSize(250, 250))

PublisherAdView 将默认采用第一个参数中传递的尺寸,直到返回下一个广告。

您还可以使用 XML 布局文件中的 ads:adSizes 属性指定多个广告尺寸:

<com.google.android.gms.ads.doubleclick.PublisherAdView
   android:id="@+id/multiple_ad_sizes_view"
   android:layout_width="wrap_parent"
   android:layout_height="wrap_content"
   android:layout_alignParentBottom="true"
   android:layout_centerHorizontal="true"
   ads:adSizes="BANNER,120x20,250x250"
   ads:adUnitId="ad unit ID" />

有关 Android API Demo 应用中多个广告尺寸的实现方式,请参阅 Ad Manager 多个广告尺寸示例

手动展示次数统计

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

Java

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

Kotlin

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

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

Java

mPublisherAdView.recordManualImpression();

Kotlin

mPublisherAdView.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)

您可以通过活动或任何其他对象实现此接口:

Java

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

public class BannerExample extends Activity implements AppEventListener {
}

Kotlin

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

class BannerExample : Activity(), AppEventListener {
}

然后传递给 PublisherAdView

Java

adView.setAppEventListener(this);

Kotlin

adView.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="//media.admob.com/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>

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

Additional resources

Samples on GitHub

Mobile Ads Garage video tutorials