广告是移动应用开发者最常用的流量变现方法之一,当App用户增长到一定数量后,开发者就需要考虑如何进行流量变现,帮助应用实现商业可持续增长,使应用不断拓展壮大。
华为广告平台则为开发者提供了高效的流量变现解决方案,华为广告与海量优质的广告主合作,能为开发者带来优质的广告资源,拥有具有竞争力的eCPM(每1000次展示所带来的收益);此外,平台秉承业界最具优质的分成政策,为开发者带来高额的收入回报;与终端匹配的广告UX设计,可以向用户呈现出精品广告内容,最大平衡用户体验和变现能力。
为了帮助开发者实现流量变现,当前华为广告服务提供了6种广告形式。
1. Banner广告:
Banner广告是在应用程序顶部、中部或底部占据一个位置的矩形图片,广告内容每隔一段时间会自动刷新,点击内容时会跳转到广告主的页面。Banner广告的优势在于长期稳定展示,曝光量大。适合于游戏页、阅读资讯页、工具功能页等用户停留较久或者访问频繁的页面。
2. 原生广告:
原生广告是创建与应用内容融于一体的广告形式,包含图片、文字和视频。原生广告将广告内容作为信息或服务内容的一部分植入到应用设计中,常见于信息流场景。原生广告的优势在于可以让广告在应用中看起来更自然,让用户有浑然一体的使用体验,减少广告对用户的干扰。
3. 激励广告:
激励广告是一种全屏幕的视频广告,用户可以选择点击观看,以换取相应奖励。用户体验好,点击率高。常见的应用场景有游戏中玩家复活,领取奖励,或者是视频应用中看广告奖励电影优惠券等等。用户更喜欢有奖励的广告,因为他们可以用时间付费,获得原本要花钱才能得到的奖励。除此以外,激励广告把用户放在主导地位,用户可以自主选择是否观看广告,减少了对用户体验的影响。
4. 插屏广告:
插屏广告是一种在应用开启、暂停或退出时以全屏的形式弹出的广告形式。当应用展示插屏广告时,用户既可以选择点击该广告,进而访问其目标网站,也可以将其广播,并返回应用。插屏广告展示时机巧妙避开用户对应用的正常体验的影响,尺寸大,曝光效果好。
5. 开屏广告:
开屏广告是一种在应用启动时且在应用主界面显示之前需要被展示的广告。一般是5s展示时间,用户可以点击跳过按钮直接进入主界面。开屏广告的优点是展示面积大,便于优质内容曝光;缺点在于每次启动时单次展示,用户可能还没来得及看完就自动跳过了。开屏广告一般用于大规模的品牌曝光,提高品牌知名度。
6. 贴片广告:
贴片广告是一种在视频播放过程中插入的视频或图片广告。视频广告一般是15s, 可以点跳过按钮直接进入视频播放界面,也可以等广告展示结束自动进入视频播放界面。只要用户观看视频,贴片广告就会出现,所以贴片广告的触达率较高。
以上就是华为广告服务提供的6种广告形式,那如何才能将这6种广告形式集成到自己的App中呢?接下来的文章会详细讲解开发步骤。
示例代码已在相关社区进行开源,欢迎开发者关注、下载并提供宝贵意见:
Github官方地址:https://github.com/hms-core/hms-ads-demo-java
Gitee官方地址:https://gitee.com/hms-core/hms-ads-demo-java
前提条件
HUAWEI Ads SDK依赖HMS Core(APK)4.0.0.300及以上版本。如果设备上未安装HMS Core(APK)4.0.0.300及以上版本,则无法使用HUAWEI Ads SDK的相关接口。
在开发应用前需要在华为开发者联盟网站上注册成为开发者并完成实名认证,具体方法可参见帐号注册认证。
参见创建项目和在项目中添加应用完成应用的创建。
开发前准备
广告服务的集成需如下4个关键步骤,可以参考华为开发者联盟文档
1. 导入HUAWEI Ads SDK
2. 配置网络权限
3. 配置混淆脚本
4. 初始化SDK
开发关键步骤
1. 如何集成Banner广告
1.1 添加BannerView。
HUAWEI Ads SDK支持以下两种方式添加BannerView来展示Banner广告:
- 通过配置XML布局文件添加
在XML布局文件中添加BannerView,并通过配置hwads:adId和hwads:bannerSize属性,来设置广告位ID和尺寸。以下示例代码中展示了如何在XML布局文件中添加BannerView。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res-auto"
xmlns:hwads="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.huawei.hms.ads.banner.BannerView
android:id="@+id/hw_banner_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
hwads:adId="testw6vs28auh3"
hwads:bannerSize="BANNER_SIZE_360_57"/>
</RelativeLayout>
以下示例代码展示了如何获取BannerView
BannerView bannerView = findViewById(R.id.hw_banner_view);
- 通过编程方式添加。
在代码中添加BannerView,并设置广告位ID和尺寸
BannerView bannerView = new BannerView(this);
// "testw6vs28auh3"为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
bannerView.setAdId("testw6vs28auh3");
bannerView.setBannerAdSize(BannerAdSize.BANNER_SIZE_360_57);
FrameLayout adFrameLayout = findViewById(R.id.ad_frame);
adFrameLayout.addView(bannerView);
1.2 获取广告
BannerView创建好之后,通过BannerView类的loadAd()方法来获取广告。
import com.huawei.hms.ads.AdParam;
import com.huawei.hms.ads.BannerAdSize;
import com.huawei.hms.ads.banner.BannerView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取BannerView
BannerView bannerView = findViewById(R.id.hw_banner_view);
// 设置广告位ID和广告尺寸,"testw6vs28auh3"为测试专用的广告位ID
bannerView.setAdId("testw6vs28auh3");
bannerView.setBannerAdSize(BannerAdSize.BANNER_SIZE_360_57);
// 设置轮播时间间隔为30秒
bannerView.setBannerRefresh(30);
// 创建广告请求,获取广告
AdParam adParam = new AdParam.Builder().build();
bannerView.loadAd(adParam);
}
}
1.3 监听广告事件
通过实现AdListener类中的方法来监听广告事件。了解详细方法,请参见API文档中的AdListener类。
bannerView.setAdListener(adListener);
private AdListener adListener = new AdListener() {
@Override
public void onAdLoaded() {
// 广告获取成功时调用
...
}
@Override
public void onAdFailed(int errorCode) {
// 广告获取失败时调用
...
}
@Override
public void onAdOpened() {
// 广告打开时调用
...
}
@Override
public void onAdClicked() {
// 广告点击时调用
...
}
@Override
public void onAdLeave() {
// 广告离开应用时调用
...
}
@Override
public void onAdClosed() {
// 广告关闭时调用
...
}
};
2. 如何集成原生广告
原生广告需要通过NativeAdLoader类获取。
2.1 构建NativeAdLoader
NativeAdLoader类提供了NativeAdLoader.Builder类,可用于设置广告位ID、设置自定义选项和构建NativeAdLoader对象。
// "testy63txaom86"为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
NativeAdLoader.Builder builder = new NativeAdLoader.Builder(this, "testy63txaom86");
builder.setNativeAdLoadedListener(new NativeAd.NativeAdLoadedListener() {
@Override
public void onNativeAdLoaded(NativeAd nativeAd) {
// 广告获取完成后调用
...
}
}).setAdListener(new AdListener() {
@Override
public void onAdFailed(int errorCode) {
// 广告获取失败时调用
...
}
});
NativeAdLoader nativeAdLoader = builder.build();
当获取广告成功后,SDK会调用NativeAd.NativeAdLoadedListener监听器的onNativeAdLoaded()方法返回NativeAd对象。当获取广告失败后,SDK会调用AdListener监听器的onAdFailed()方法。
2.2 获取广告
NativeAdLoader提供loadAd()和loadAds()的两种方法获取广告。
- loadAd()请求单个原生广告:AdParam是唯一的参数。调用loadAd()后,SDK将对添加的监听器方法进行一次成功或失败的回调。
nativeAdLoader.loadAd(new AdParam.Builder().build());
- loadAd()请求指定创意类型的原生广告:AdParam.Builder提供了setDetailedCreativeTypeList接口,支持传入请求的创意类型。
List<Integer> detailedCreativeTypeList = new ArrayList<>();
// 添加指定的创意类型:原生大图
detailedCreativeTypeList.add(DetailedCreativeType.BIG_IMG);
AdParam.Builder adRequestBuilder = new AdParam.Builder();
adRequestBuilder.setDetailedCreativeTypeList(detailedCreativeTypeList);
nativeAdLoader.loadAd(adRequestBuilder.build());
- loadAds()请求多个原生广告:loadAds()请求有两个参数,除AdParam外,还有请求加载的最大广告数量为5。SDK返回的广告数量将会小于等于所请求的广告数量,并且广告皆不相同。
nativeAdLoader.loadAds(new AdParam.Builder().build(), 5);
当获取广告成功后,SDK会多次调用NativeAd.NativeAdLoadedListener监听器的onNativeAdLoaded()方法分别返回一个NativeAd对象,在广告都返回后再调用AdListener监听器的onAdLoded()方法回调通知此次请求成功;当获取广告失败后,SDK会调用AdListener监听器的onAdFailed()方法。
// "testy63txaom86"为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
NativeAdLoader.Builder builder = new NativeAdLoader.Builder(this, "testy63txaom86");
NativeAdLoader nativeAdLoader = builder.setNativeAdLoadedListener(new NativeAd.NativeAdLoadedListener() {
@Override
public void onNativeAdLoaded(NativeAd nativeAd) {
// 广告加载成功回调,多个广告对应多个回调
...
}
}).setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
// 广告加载完成回调,说明此次广告加载成功,而且所有广告都已回调完成。
...
}
@Override
public void onAdFailed(int errorCode) {
// 广告加载失败
...
}
}).build();
nativeAdLoader.loadAds(new AdParam.Builder().build(), 5);
2.3 展示原生广告
获取到广告后在监听器的回调方法中展示原生广告,需要在每个广告视图的一角展示“为什么看到此广告”的图标“i”或“不再显示该广告”的图标“x”,并且必须展示广告标识。
以下是展示原生广告的步骤:
- 定义原生广告布局
需要自定义一个布局用于展示NativeAd中的素材
<com.huawei.hms.ads.nativead.NativeView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
... >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
... >
<!-- 多媒体视图 -->
<com.huawei.hms.ads.nativead.MediaView
android:id="@+id/ad_media"
android:layout_width="75dp"
android:layout_height="50dp"
... />
<RelativeLayout
... >
<TextView
android:id="@+id/ad_title"
android:layout_width="match_parent"
android:layout_height="34dp"
... />
<!-- 其他素材 -->
...
</RelativeLayout>
<!-- 其他素材 -->
...
</RelativeLayout>
</com.huawei.hms.ads.nativead.NativeView>
- 注册和填充素材视图
获取到NativeView对象后,需要注册和填充素材。
private void initNativeAdView(NativeAd nativeAd, NativeView nativeView) {
// 注册和填充标题素材视图
nativeView.setTitleView(nativeView.findViewById(R.id.ad_title));
((TextView) nativeView.getTitleView()).setText(nativeAd.getTitle());
// 注册和填充多媒体素材视图
nativeView.setMediaView((MediaView) nativeView.findViewById(R.id.ad_media));
nativeView.getMediaView().setMediaContent(nativeAd.getMediaContent());
// 注册和填充其他素材视图
nativeView.setAdSourceView(nativeView.findViewById(R.id.ad_source));
nativeView.setCallToActionView(nativeView.findViewById(R.id.ad_call_to_action));
if (null != nativeAd.getAdSource()) {
((TextView) nativeView.getAdSourceView()).setText(nativeAd.getAdSource());
}
nativeView.getAdSourceView()
.setVisibility(null != nativeAd.getAdSource() ? View.VISIBLE : View.INVISIBLE);
if (null != nativeAd.getCallToAction()) {
((Button) nativeView.getCallToActionView()).setText(nativeAd.getCallToAction());
}
nativeView.getCallToActionView()
.setVisibility(null != nativeAd.getCallToAction() ? View.VISIBLE : View.INVISIBLE);
// 注册原生广告对象
nativeView.setNativeAd(nativeAd);
}
依次设置其他要展示的广告素材。
MediaView用于展示多媒体素材。如果获取的广告含有视频素材,则视频会在MediaView内播放。否则MediaView会显示一个图片素材。
- 向NativeView注册原生广告对象
nativeView.setNativeAd(nativeAd);
- 展示NativeView
private void loadAd() {
NativeAdLoader.Builder builder = new NativeAdLoader.Builder(this, "testy63txaom86");
builder.setNativeAdLoadedListener(new NativeAd.NativeAdLoadedListener() {
@Override
public void onNativeAdLoaded(NativeAd nativeAd) {
...
// 获取NativeView视图
NativeView nativeView = (NativeView) getLayoutInflater().inflate(R.layout.ad_native, null);
// 注册和填充原生广告素材视图
initNativeAdView(nativeAd, nativeView);
// 将NativeView添加到界面
FrameLayout adFrameLayout = findViewById(R.id.frame_layout_ad);
adFrameLayout.removeAllViews();
adFrameLayout.addView(nativeView);
...
}
});
...
}
private void initNativeAdView(NativeAd nativeAd, NativeView nativeView) {
// 注册和填充标题素材视图
nativeView.setTitleView(nativeView.findViewById(R.id.ad_title));
((TextView) nativeView.getTitleView()).setText(nativeAd.getTitle());
// 注册和填充多媒体素材视图
nativeView.setMediaView((MediaView) nativeView.findViewById(R.id.ad_media));
nativeView.getMediaView().setMediaContent(nativeAd.getMediaContent());
// 注册和填充其他素材视图
...
// 注册原生广告对象
nativeView.setNativeAd(nativeAd);
}
2.4 监听广告事件
NativeAdLoader nativeAdLoader = builder.setAdListener(new AdListener() {
@Override
public void onAdClicked() {
// 广告点击时调用
...
}
...
}).build();
2.5 销毁广告
nativeAd.destroy()
3. 如何集成激励广告
3.1 创建激励广告对象
public class RewardedVideoActivity extends Activity {
// "testx9dtjwj8hp"为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
private static final String AD_ID = "testx9dtjwj8hp";
private RewardAd rewardAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rewarded);
// 创建激励广告对象
createRewardAd();
}
private void createRewardAd() {
rewardAd = new RewardAd(this, AD_ID);
}
}
3.2 获取广告
/**
* 加载激励广告
*/
private void loadRewardAd() {
if (rewardAd == null) {
rewardAd = new RewardAd(this, AD_ID);
}
RewardAdLoadListener listener= new RewardAdLoadListener() {
@Override
public void onRewardedLoaded() {
// 激励广告加载成功
}
@Override
public void onRewardAdFailedToLoad(int errorCode) {
// 激励广告加载失败
}
};
rewardAd.loadAd(new AdParam.Builder().build(), listener);
}
3.3 展示广告
调用RewardAd的show(Activity activity,RewardAdStatusListener rewardAdStatusListener)方法来显示广告,在此之前需要调用isLoaded()方法来确认广告已经加载完成。
/**
* 展示激励广告
*/
private void rewardAdShow() {
if (rewardAd.isLoaded()) {
rewardAd.show(RewardedVideoActivity.this, new RewardAdStatusListener() {
@Override
public void onRewardAdOpened() {
// 激励广告被打开
...
}
@Override
public void onRewardAdFailedToShow(int errorCode) {
// 激励广告展示失败
...
}
@Override
public void onRewardAdClosed() {
// 激励广告被关闭
...
}
@Override
public void onRewarded(Reward reward){
// 激励广告奖励达成,发放奖励
...
}
});
}
}
4. 如何集成插屏广告
4.1 创建插屏广告对象
创建InterstitialAd对象,并通过InterstitialAd类的setAdId()方法设置测试广告位ID
private InterstitialAd interstitialAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_interstitial);
interstitialAd = new InterstitialAd(this);
// "testb4znbuh3n2"为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
interstitialAd.setAdId("testb4znbuh3n2");
loadInterstitialAd();
}
4.2 获取广告
调用InterstitialAd对象的 loadAd() 方法来获取广告
private void loadInterstitialAd() {
...
// 获取插屏广告
AdParam adParam = new AdParam.Builder().build();
interstitialAd.loadAd(adParam);
...
}
4.3 展示广告
调用InterstitialAd的show(Activity activity)方法来显示广告,在此之前需要调用isLoaded()方法来确认广告已经加载完成。
private void showInterstitialAd() {
// 显示广告
if (interstitialAd != null && interstitialAd.isLoaded()) {
interstitialAd.show(this);
} else {
Toast.makeText(this, "Ad did not load", Toast.LENGTH_SHORT).show();
}
}
4.4 监听广告事件
调用InterstitialAd类的setAdListener方法可以为InterstitialAd对象添加广告事件监听器AdListener,并通过实现AdListener类中的方法来监听广告事件。了解详细方法,请参见API文档中的AdListener类。
...
interstitialAd.setAdListener(adListener);
...
private AdListener adListener = new AdListener() {
@Override
public void onAdLoaded() {
// 广告获取成功时调用
...
showInterstitialAd();
}
@Override
public void onAdFailed(int errorCode) {
// 广告获取失败时调用
...
}
@Override
public void onAdClosed() {
// 广告关闭时调用
...
}
@Override
public void onAdClicked() {
// 广告点击时调用
...
}
@Override
public void onAdLeave() {
//广告离开时调用
...
}
@Override
public void onAdOpened() {
// 广告打开时调用
...
}
@Override
public void onAdImpression() {
// 广告曝光时调用
...
}
};
5. 如何集成开屏广告
5.1 添加SplashView
在XML布局文件中添加SplashView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SplashActivity">
<!-- 开屏广告Logo区域 -->
<RelativeLayout
android:id="@+id/logo_area"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_alignParentBottom="true"
android:background="@android:color/white"
android:visibility="visible">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="6dp"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="28dp"
android:layout_height="28dp"
android:background="@mipmap/ic_launcher" />
<View
android:layout_width="0.5dp"
android:layout_height="18dp"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:alpha="0.1"
android:background="@android:color/black" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="1"
android:text="@string/owner"
android:textColor="@android:color/black"
android:textSize="16sp" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:alpha="0.5"
android:text="@string/copyright_info"
android:textColor="@android:color/black"
android:textSize="8sp" />
</LinearLayout>
</RelativeLayout>
<!-- 开屏广告视图 -->
<com.huawei.hms.ads.splash.SplashView
android:id="@+id/splash_ad_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/logo" />
</RelativeLayout>
以下示例代码展示了如何获取SplashView
SplashView splashView = findViewById(R.id.splash_ad_view);
5.2 修改应用默认启动页面
开屏广告是在应用主界面显示之前被展示,所以需修改应用默认启动页面。
修改AndroidManifest.xml, 将默认启动的activity修改为SplashActivity,这样即可在应用主界面加载前展示开屏广告。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.huawei.hms.ads.sdk">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:exported="false"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".SplashActivity"
android:exported="true"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
...
</application>
</manifest>
创建SplashActivity.java类,用于实现开屏广告获取和展示
import android.os.Build;
import androidx.appcompat.app.AppCompatActivity;
public class SplashActivity extends AppCompatActivity {
// "testq6zq98hecj"为测试专用的广告位ID, App正式发布时需要改为正式的广告位ID
private static final String AD_ID = "testq6zq98hecj";
private static final int AD_TIMEOUT = 5000;
private static final int MSG_AD_TIMEOUT = 1001;
/**
* 暂停标志位。
* 在开屏广告页面展示时:
* 按返回键退出应用时需设置为true,以确保应用主界面不被拉起;
* 切换至其他界面时需设置为false,以确保从其他页面回到开屏广告页面时仍然可以正常跳转至应用主界面;
*/
private boolean hasPaused = false;
// 收到广告展示超时消息时的回调处理
private Handler timeoutHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
if (SplashActivity.this.hasWindowFocus()) {
jump();
}
return false;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
// 获取并展示开屏广告
loadAd();
}
/**
* 广告展示完毕时,从广告界面跳转至App主界面
*/
private void jump() {
if (!hasPaused) {
hasPaused = true;
startActivity(new Intent(SplashActivity.this, MainActivity.class));
finish();
}
}
/**
* 按返回键退出应用时需设置为true,以确保应用主界面不被拉起
*/
@Override
protected void onStop() {
// 移除消息队列中等待的超时消息
timeoutHandler.removeMessages(MSG_AD_TIMEOUT);
hasPaused = true;
super.onStop();
}
/**
* 从其他页面回到开屏页面时调用,进入应用主界面
*/
@Override
protected void onRestart() {
super.onRestart();
hasPaused = false;
jump();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
5.3 获取广告
SplashView创建好之后,通过SplashView类的load()方法来获取广告
private void loadAd() {
int orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
AdParam adParam = new AdParam.Builder().build();
SplashView.SplashAdLoadListener splashAdLoadListener = new SplashView.SplashAdLoadListener() {
@Override
public void onAdLoaded() {
// 广告获取成功时调用
...
}
@Override
public void onAdFailedToLoad(int errorCode) {
// 广告获取失败时调用, 跳转至App主界面
jump();
}
@Override
public void onAdDismissed() {
// 广告展示完毕时调用, 跳转至App主界面
jump();
}
};
// 获取SplashView
SplashView splashView = findViewById(R.id.splash_ad_view);
// 设置默认Slogan
splashView.setSloganResId(R.drawable.default_slogan);
// 设置视频类开屏广告的音频焦点类型
splashView.setAudioFocusType(AudioFocusType.NOT_GAIN_AUDIO_FOCUS_WHEN_MUTE);
// 获取广告,其中AD_ID为广告位ID
splashView.load(AD_ID, orientation, adParam, splashAdLoadListener);
// 发送延时消息,保证广告显示超时后,APP首页可以正常显示
timeoutHandler.removeMessages(MSG_AD_TIMEOUT);
timeoutHandler.sendEmptyMessageDelayed(MSG_AD_TIMEOUT, AD_TIMEOUT);
}
5.4 监听广告事件
通过实现SplashAdDisplayListener类中的方法来监听广告展示类事件。了解详细方法,请参见API文档中的SplashAdDisplayListener类
SplashAdDisplayListener adDisplayListener = new SplashAdDisplayListener() {
@Override
public void onAdShowed() {
// 广告显示时调用
...
}
@Override
public void onAdClick() {
// 广告被点击时调用
...
}
};
splashView.setAdDisplayListener(adDisplayListener);
6. 如何集成贴片广告
6.1 创建InstreamAdLoader
InstreamAdLoader类提供了InstreamAdLoader.Builder类,可用于设置广告位ID、设置自定义选项和创建InstreamAdLoader对象。
// "testy3cglm3pj0"为测试专用的广告位ID,App正式发布时需要改为正式的广告位ID
InstreamAdLoader.Builder builder = new InstreamAdLoader.Builder(context, "testy3cglm3pj0");
// 设置贴片最大时长
InstreamAdLoader adLoader = builder.setTotalDuration(totalDuration)
// 设置贴片返回的最大数量
.setMaxCount(maxCount)
.setInstreamAdLoadListener(new InstreamAdLoadListener() {
@Override
public void onAdLoaded(List<InstreamAd> ads) {
// 广告获取成功后调用
...
}
@Override
public void onAdFailed(int errorCode) {
// 广告获取失败后调用
...
}
}).build();
当获取广告成功后,SDK会调用InstreamAdLoadListener监听器的onAdLoaded()方法返回的InstreamAd对象列表。当获取广告失败后,SDK会调用InstreamAdLoadListener监听器的onAdFailed()方法。
6.2 获取广告
InstreamAdLoader提供loadAd()方法获取广告
InstreamAdLoader.loadAd(new AdParam.Builder().build());
调用loadAd()后,SDK将对添加的监听器方法进行一次成功或失败的回调。
6.3 展示贴片广告
获取到广告后在监听器的回调方法中展示贴片广告,需要在每个广告视图的一角展示“为什么看到此广告”的图标“i”或者“不再显示该广告”的图标“x”,并且必须展示广告标识。
以下是展示贴片广告的步骤:
- 定义贴片广告布局
需要定义一个布局用于展示InstreamAd列表中的广告素材。
<RelativeLayout
android:id="@+id/instream_ad_container"
android:layout_width="match_parent"
android:layout_height="200dp"
android:visibility="gone">
<!-- 贴片广告视图 -->
<com.huawei.hms.ads.instreamad.InstreamView
android:id="@+id/instream_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 跳过按钮视图 -->
<TextView
android:id="@+id/instream_skip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
...
/>
<!-- 倒计时视图 -->
<TextView
android:id="@+id/instream_count_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
...
/>
<!-- 广告标识视图 -->
<TextView
android:id="@+id/instream_ad_flag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
...
/>
<!-- 为什么展示此广告视图 -->
<ImageView
android:id="@+id/instream_why_this_ad"
android:layout_width="14dp"
android:layout_height="14dp"
...
/>
<!-- 点击广告跳转按钮 -->
<TextView
android:id="@+id/instream_call_to_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
...
/>
</RelativeLayout>
- 注册广告到广告视图
获取到InstreamAd对象列表后,需要将广告注册到广告视图。
instreamView.setInstreamAds(ads);
- 监听广告状态
贴片广告提供了InstreamMediaStateListener、InstreamMediaChangeListener和MediaMuteListener来监听贴片广告状态。
instreamView.setInstreamMediaChangeListener(new InstreamMediaChangeListener(){
@Override
public void onSegmentMediaChange(InstreamAd ad) {
// 广告媒体切换
...
}
});
instreamView.setInstreamMediaStateListener(new InstreamMediaStateListener() {
@Override
public void onMediaProgress(int percent, int playTime) {
// 播放过程
...
}
@Override
public void onMediaStart(int playTime) {
// 播放开始
...
}
@Override
public void onMediaPause(int playTime) {
// 播放暂停
...
}
@Override
public void onMediaStop(int playTime) {
// 播放停止
...
}
@Override
public void onMediaCompletion(int playTime) {
// 播放完成
...
}
@Override
public void onMediaError(int playTime, int errorCode, int extra) {
// 播放错误
...
}
});
instreamView.setMediaMuteListener(new MediaMuteListener() {
@Override
public void onMute() {
// 贴片广告静音
...
}
@Override
public void onUnmute() {
// 贴片广告取消静音
...
}
});
- 销毁广告
当贴片广告展示结束时,应将贴片广告视图销毁。
instreamView.destroy();
>>访问华为开发者联盟官网,了解更多相关内容
>>获取开发指导文档
>>华为移动服务开源仓库地址:GitHub、Gitee
点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~