对于开发者来讲,广告是一种拥有流量便可变现的低门槛变现方式。但对于用户来讲,在使用App的过程当中,广告数量过多,广告内容劣质,很是影响用户体验,甚至形成用户流失。那么开发者如何才能兼得广告变现和用户体验呢?使用原生广告就是很好的解决方法之一。java
什么是原生广告
原生广告是建立与应用内容融于一体的广告形式,包含图片、文字和视频。原生广告将广告内容做为信息或服务内容的一部分植入到应用设计中,常见于信息流场景。android
原生广告的优点
原生广告可让广告在应用中看起来更天然。和Banner广告相比,原生广告对用户注意力影响较小,让用户有浑然一体的观看体验,减小广告对用户的干扰。git
原生广告支持自定义界面,与其余广告格式相比,如何在App中展现广告方面,原生广告具备更高的灵活性,可让广告主展现更多的广告内容。github
原生广告支持自由定制界面,可让用户在App中得到更好的广告体验,而且能够帮助开发者提升从广告中得到的收益。所以,若是开发者既想经过广告提升收益,又想尽量减小广告对用户体验的影响,不妨考虑使用原生广告。华为广告服务可以帮助开发者接入包括原生广告在内的6种广告位,接下来的文章会详细讲解开发步骤。网络
示例代码已在相关社区进行开源,欢迎开发者关注、下载并提供宝贵意见:app
Github官方地址:https://github.com/hms-core/hms-ads-demo-javaide
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
点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~