对于开发者来说,广告是一种拥有流量即可变现的低门槛变现方式。但对于用户来说,在使用App的过程中,广告数量过多,广告内容劣质,非常影响用户体验,甚至造成用户流失。那么开发者如何才能兼得广告变现和用户体验呢?使用原生广告就是很好的解决方法之一。
什么是原生广告
原生广告是创建与应用内容融于一体的广告形式,包含图片、文字和视频。原生广告将广告内容作为信息或服务内容的一部分植入到应用设计中,常见于信息流场景。
原生广告的优势
原生广告可以让广告在应用中看起来更自然。和Banner广告相比,原生广告对用户注意力影响较小,让用户有浑然一体的观看体验,减少广告对用户的干扰。
原生广告支持自定义界面,与其他广告格式相比,如何在App中展示广告方面,原生广告具有更高的灵活性,可以让广告主展示更多的广告内容。
原生广告支持自由定制界面,可以让用户在App中获得更好的广告体验,并且可以帮助开发者提高从广告中获得的收益。因此,如果开发者既想通过广告提高收益,又想尽可能减少广告对用户体验的影响,不妨考虑使用原生广告。华为广告服务能够帮助开发者接入包括原生广告在内的6种广告位,接下来的文章会详细讲解开发步骤。
示例代码已在相关社区进行开源,欢迎开发者关注、下载并提供宝贵意见:
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
开发关键步骤
原生广告需要通过NativeAdLoader类获取。
1.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()方法。
1.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);
1.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);
}
1.4 监听广告事件
NativeAdLoader nativeAdLoader = builder.setAdListener(new AdListener() {
@Override
public void onAdClicked() {
// 广告点击时调用
...
}
...
}).build();
1.5 销毁广告
nativeAd.destroy()
如何添加其他类型的广告
>>访问华为广告服务官网,了解更多相关内容
>>获取华为广告服务开发指导文档
>>华为移动服务开源仓库地址:GitHub、Gitee
点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~