横幅广告是占据应用部分布局的矩形广告。当用户与应用互动时,这类广告会停留在屏幕上(锚定在屏幕顶部或底部,或在用户滚动时内嵌在内容中)。横幅广告可在一段时间后自动刷新。如需了解详情,请参阅 横幅广告概览。
本指南介绍了如何开始使用 锚定自适应横幅广告,此类广告可根据您指定的广告宽度针对每种设备优化广告尺寸,从而最大限度地提升广告效果。
锚定自适应横幅广告是宽高比固定的广告,而不是常规的固定尺寸广告。宽高比类似于业界标准的 320x50。在您指定可用的全宽后,系统将根据该宽度返回具有最佳高度的广告。最佳高度不会因来自同一设备的请求而发生变化,并且广告刷新时周围的视图也无需移动。
前提条件
- 完成入门指南。
始终使用测试广告进行测试
在构建和测试应用时,请确保使用测试广告,而不是实际投放的广告。否则,可能会导致您的帐号被暂停。
对于 Android 横幅广告,加载测试广告最简便的方法就是使用下面的专用测试广告单元 ID:
/21775744923/example/banner
该测试广告单元 ID 已经过专门配置,可为每个请求返回测试广告。您可以在自己应用的编码、测试和调试过程中使用该测试库。只需确保在发布应用前用您自己的广告单元 ID 替换该测试广告单元 ID 即可。
如需详细了解移动广告 SDK 的测试广告如何运作,请参阅测试广告。
将 AdManagerAdView 添加到布局
要展示横幅广告,首先要将 AdManagerAdView
放置到您希望用于展示广告的 Activity
或 Fragment
的布局中:
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("/21775744923/example/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 = "/21775744923/example/banner"
// Create an ad request.
val adRequest = AdManagerAdRequest.Builder().build()
// Start loading the ad in the background.
adView.loadAd(adRequest)
}
加载广告
AdManagerAdView 放置好后,下一步是加载广告。此步骤可使用 AdManagerAdView
类中的 loadAd()
方法完成。这需要 AdManagerAdRequest
参数,该参数包含有关单个广告请求的运行时信息,如定位信息。
下例展示了如何通过 Activity
的 onCreate()
方法加载广告:
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网页界面中指定的任何刷新频率。如果您尚未启用刷新,则需要发出新的请求。
大功告成!您的应用现在就可以展示横幅广告了。
广告事件
您可以监听广告生命周期内的许多事件,包括加载、广告展示和点击以及广告打开和关闭事件。建议在加载横幅广告之前设置回调。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() 方法。 |
适用于视频广告的硬件加速
为了在横幅广告视图中成功展示视频广告,必须启用硬件加速。
硬件加速默认处于启用状态,但某些应用可能会选择将其停用。如果您的应用属于这种情况,我们建议您为使用广告的 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 本身启用硬件加速。
手动统计展示
手动展示次数统计仅适用于直接在 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>
有关 API Demo 应用中应用事件的实现方式,请参阅 Ad Manager 应用事件示例。
其他资源
GitHub 上的示例
后续步骤
折叠式横幅广告
折叠式横幅广告是一种横幅广告,最初以较大的叠加层形式展示,并带有一个可将广告收起为较小尺寸的按钮。请考虑使用它进一步优化您的性能。如需了解详情,请参阅折叠式横幅广告。
内嵌自适应横幅广告
与锚定自适应横幅广告相比,内嵌自适应横幅广告是一种更大、更高的横幅广告。它们的高度可变,可以和设备屏幕一样高。对于在可滚动内容中投放横幅广告的应用,建议使用内嵌自适应横幅广告,而不是锚定自适应横幅广告。如需了解详情,请参阅内嵌自适应横幅广告。