Banner Ads

横幅广告是在应用布局中占据一处位置的矩形图片或文字广告。用户与应用互动时,这类广告会停留在屏幕上,并且可在一段时间后自动刷新。如果您刚开始接触移动广告,建议从横幅广告着手。

本指南向您介绍如何将Ad Manager横幅广告集成到 Android 应用中。除了代码段和说明之外,本指南还包含有关如何正确调整横幅广告尺寸的信息以及其他资源的链接。

前提条件

向布局中添加PublisherAdView

要展示横幅广告,首先要将PublisherAdView放置到要展示广告的 ActivityFragment 布局中。最简单的放置方法是将其添加到相应的 XML 布局文件中。在以下示例中,PublisherAdView位于 Activity 的底部:

main_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context=".MainActivity">

        <TextView android:text="@string/hello_world"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <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>

</RelativeLayout>

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

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

另外,您也可以通过编程方式创建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 32|50|90 智能横幅 手机和平板电脑 SMART_BANNER

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

Java

AdSize adSize = new AdSize(300, 50);

Kotlin

val adSize = AdSize(300, 50)

智能横幅广告

作为一种广告单元,智能横幅可在任何屏幕尺寸、任何屏幕方向的各种设备上展示与屏幕等宽的横幅广告。智能横幅广告可以检测设备处于当前屏幕方向时的宽度,并据此创建与之等宽的广告视图。

智能横幅可实现三种广告高度:

广告高度 屏幕高度
32 dp ≤ 400 dp
50 dp > 400 dp 且 ≤ 720 dp
90 dp > 720 dp

通常情况下,在手机上,当屏幕为纵向时,智能横幅广告高度为 50dp;当屏幕为横向时,广告高度为 32dp。在平板电脑上,不论屏幕是纵向还是横向,广告高度通常均为 90 dp。

当图片广告不足以占据所分配的整个空间时,系统会居中放置图片,然后填充两侧剩余的空间。

要在 XML 中使用智能横幅广告,请为广告尺寸指定常量 SMART_BANNER,并将 AdView 的宽度设置为 match_parent。例如:

<com.google.android.gms.ads.doubleclick.PublisherAdView
  xmlns:ads="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  ads:adSize="SMART_BANNER"
  ads:adUnitId="ca-app-pub-3940256099942544/6300978111">
</com.google.android.gms.ads.doubleclick.PublisherAdView>

要以编程方式制作智能横幅广告,请使用 AdSize.SMART_BANNER 作为广告尺寸:

Java

PublisherAdView adView = new PublisherAdView(this);
adView.setAdSizes(AdSize.SMART_BANNER);

Kotlin

val adView = PublisherAdView(this)
adView.adSizes = AdSize.SMART_BANNER

自定义广告尺寸

除了标准广告单元之外,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="YOUR_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

Next steps

发送以下问题的反馈:

此网页
Mobile Ads SDK for Android
Mobile Ads SDK for Android
需要帮助?请访问我们的支持页面