概述
原生广告是创建与应用内容融于一体的广告形式,支持开发者自由定制界面。
通过使用原生广告可以让应用界面UI更加友好,提升用户体验。
添加原生广告
定义广告布局
代码如下:
<com.huawei.hms.ads.nativead.NativeView xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="https://schemas.android.com/tools" xmlns:hwads="https://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" app:ignore="NamespaceTypo"> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> ... <com.huawei.hms.ads.nativead.MediaView android:id="@+id/ad_media_small" android:layout_width="75dp" android:layout_height="50dp" .../> ... <com.huawei.hms.ads.nativead.MediaView android:id="@+id/ad_media_large" android:layout_width="match_parent" android:layout_height="wrap_content" /> ... <com.huawei.hms.ads.nativead.MediaView android:id="@+id/ad_media_video" android:layout_width="match_parent" android:layout_height="wrap_content" /> ... </LinearLayout> </androidx.core.widget.NestedScrollView> </com.huawei.hms.ads.nativead.NativeView>
根据原生广告类型,布局文件中定义了三种类型的原生广告,分别是小视图,大视图,视频,具体尺寸如下:
形式 | 尺寸 | 比列 |
---|---|---|
小视图 | 225*150 | 3:2 |
大视图 | 1080*607 | 16:9 |
视频 | 640*360 | 16:9 |
实际尺寸根据开发者定义为主,只要在上表范围之内,开发者想怎么定义就怎么定义。
布局中的根布局一定要是华为自定义的NativeView,否则会影响广告收益,为什么呢?看看源码:
@GlobalApi public class NativeView extends PPSNativeView implements INativeView { ... }
public class PPSNativeView extends RelativeLayout implements ga, lh { ... }
@GlobalApi public interface INativeView { void destroy(); ChoicesView getChoicesView(); View getAdSourceView(); View getDescriptionView(); View getCallToActionView(); View getTitleView(); View getIconView(); View getImageView(); MediaView getMediaView(); View getPriceView(); View getRatingView(); View getMarketView(); ... }
从上述代码可以看出,NativeView继承PPSNativeView ,PPSNativeView 继承RelativeLayout ,也就是说NativeView是一种RelativeLayout(相对布局)。PPSNativeView 实现了INativeView 接口,INativeView 中对于原生广告的各种元素做出了明确的定义,通过实现这些方法,广告投放者可以清楚知道用户对广告干了什么,点了哪里等等等等,所以说不用NativeView可能会影响收益。
上述XML布局中还使用了一个重要的控件:MediaView。MediaView到底是什么东西?
@GlobalApi public class MediaView extends RelativeLayout { private NativeVideoView Code; private NativeWindowImageView V; private b I; private ScaleType B; ... }
上述代码中说了,MediaView 也是一种RelativeLayout (相对布局),能够加载图片,也能播放视频,还能自动缩放。不管是NativeVideoView还是NativeWindowImageView 也都是一种相对布局,以NativeVideoView为例:
public class NativeVideoView extends NativeMediaView implements lc, ls { ... }
public abstract class NativeMediaView extends AutoScaleSizeRelativeLayout { ... }
public class AutoScaleSizeRelativeLayout extends RelativeLayout { ... }
从上述代码片段中可以发现,NativeVideoView是一种可自动播放视频,可缩放的相对布局。自动播放指的是当广告呈现在可视页面的时候会自动播放,当用户将广告滑动到其他地方无法看见的时候会停止播放,具体细节自己看源码。总体来讲原生MediaView 是开发者的福音,不用额外集成图片加载框架,也不用视频播放插件,更不用对各种状态进行监听,还能及时释放资源,又能减少体积,省时又省力非常好。回归正题,继续介绍相关集成。
获取广告
原生广告需要通过NativeAdLoader类获取。先构建NativeAdLoader,再通过NativeAdLoader提供loadAd()和loadAds()两种方法获取广告。
- 构建NativeAdLoader
NativeAdLoader.Builder builder = new NativeAdLoader.Builder(getContext(), nativeId); builder.setNativeAdLoadedListener(new NativeAd.NativeAdLoadedListener() { @Override public void onNativeAdLoaded(NativeAd nativeAd) { // 广告获取完成后调用 NativeView nativeView = (NativeView) getRoot(); mNativeAd = nativeAd; initNativeView(nativeAd,nativeView,nativeId); } }).setAdListener(new AdListener() { @Override public void onAdFailed(int errorCode) { // 广告获取失败时调用 ... } }); NativeAdLoader nativeAdLoader = builder.build();
其中nativeId是广告为ID。当获取广告成功后,SDK会调用NativeAd.NativeAdLoadedListener监听器的onNativeAdLoaded()方法返回NativeAd对象,此时开发者可以在此进行相关初始化操作。当获取广告失败后,SDK会调用AdListener监听器的onAdFailed()方法,此时开发者可以给出相关提示或隐藏相关广告布局等等,不至于降低用户体验度。
- 加载广告
NativeAdLoader提供loadAd()和loadAds()两种方法获取广告。
- loadAd()请求单个原生广告。AdParam是唯一的参数,AdParam不清楚可在HMS-广告服务(Banner广告)中进行查看,代码如下:
// loadAd()请求单个原生广告。 nativeAdLoader.loadAd(new AdParam.Builder().build());
- loadAds()请求多个原生广告。loadAds()请求有两个参数,除AdParam外,还有请求加载的广告数量,最大为5。SDK返回的广告数量将会小于等于所请求的广告数量,并且广告皆不相同。
// loadAds()请求多个原生广告 nativeAdLoader.loadAds(new AdParam.Builder().build(), 5);
调用loadAds()后,监听器将会根据返回的广告个数进行多次回调。请求多个广告时,可以在回调代码中使用NativeAdLoader.isLoading()方法来判断广告是否已获取完成。再次使用NativeAdLoader获取广告前,请确保先前的请求已经完成。
初始化
- 参数配置
- 如果广告中除了包含图片、文字外,还包含视频素材,需要通过VideoConfiguration类,可以对视频进行相关配置:
VideoConfiguration videoConfiguration = new VideoConfiguration.Builder() // 设置是否在静音状态下开始播放视频素材。其默认值为true。 .setStartMuted(true) .build(); NativeAdConfiguration adConfiguration = new NativeAdConfiguration.Builder() .setVideoConfiguration(videoConfiguration) // 设置视频选项 .setRequestCustomDislikeThisAd(true) // 是否要自定义“不再显示该广告” // 设置“为什么看到此广告”图标“i”或者“x”的显示位置,如右上角 .setChoicesPosition(NativeAdConfiguration.ChoicesPosition.TOP_RIGHT) .build(); builder.setNativeAdOptions(adConfiguration);
通过setStartMuted设置是否在静音状态下开始播放视频素材,通过setRequestCustomDislikeThisAd设置是否要自定义“不再显示该广告”,通过setChoicesPosition设置设置“为什么看到此广告”图标“i”或者“x”的显示位置等等。
- 如果想在视频播放过程中进行其他操作,可以通过VideoOperator类获取视频信息和视频控制。控制器实例需要通过调用NativeAd.getVideoOperator()方法获得。当广告中没有视频素材时,此方法也会返回VideoOperator对象。
VideoOperator videoOperator = nativeAd.getVideoOperator();
VideoOperator提供hasVideo()方法判断广告中是否有视频素材。
- 监听视频播放,通过实现VideoOperator.VideoLifecycleListener类可以监听视频播放过程中的事件:
videoOperator.setVideoLifecycleListener(new VideoOperator.VideoLifecycleListener() { @Override public void onVideoEnd() { // 视频播放完时调用 super.onVideoEnd(); } });
- 如果不想展示“广告已关闭”的视图,可调用NativeAd类中的setDislikeAdListener()方法为原生广告对象设置关闭广告事件监听器,并在监听器中的onAdDisliked()方法中添加自定义实现。当广告关闭时,SDK会回调监听器中的onAdDisliked()方法。
nativeAd.setDislikeAdListener(new DislikeAdListener() { @Override public void onAdDisliked() { ... } });
- 自定义版“不再显示该广告”,通过NativeAdConfiguration.Builder类中的setRequestCustomDislikeThisAd()方法可以设置是否要自定义“不再显示该广告”。当设置为自定义版“不再显示该广告”时,原生广告将会显示“为什么看到此广告”图标。如果需要隐藏“为什么看到此广告”图标,可调用NativeAdConfiguration.Builder类中的setChoicesPosition()方法将其设置为不可见。
NativeAdConfiguration adConfiguration = new NativeAdConfiguration.Builder() .setRequestCustomDislikeThisAd(true) // 需要自定义“不再显示该广告” .setChoicesPosition(NativeAdConfiguration.ChoicesPosition.INVISIBLE) // 隐藏“为什么看到此广告”图标 .build();
- 广告加载完成后需要对XML中布局进行注册和填充素材。
private void initNativeView(NativeAd nativeAd, NativeView nativeView,String nativeId) { nativeView.setTitleView(nativeView.findViewById(R.id.ad_title_video)); ... ((TextView) nativeView.getTitleView()).setText(nativeAd.getTitle()); nativeView.getMediaView().setMediaContent(nativeAd.getMediaContent()); // 注册原生广告对象 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); }
广告加载完成后获取广告的相关属性(标题,图片,视频等),然后将这些素材填充到XML布局中。
销毁
当原生广告不再展示时,应将其销毁。
@Override public void onDestroy() { if (mNativeAd != null) { mNativeAd.destroy(); } super.onDestroy(); }
效果
总结
- 广告集成简单,属性多样,播放素材多样,方便开发。
- 广告参数配置多样化,对多种用户操作都进行了反馈与控制,同时广告加载速度较快,提升了用户体验。
- 如果广告提供占位图,效果会更好。
说明
- HUAWEI Ads SDK依赖HMS Core(APK)4.0.0及以上版本。华为终端设备自带HMS Core,非华为终端设备需要安装HMS Core(APK)4.0.0及以上版本,否则无法使用HUAWEI Ads SDK的相关接口。
- 文中只对常用参数进行配置,其他参数配置需开发者进一步发掘。
- 以上广告效果测试手机:HONOR 9X 。
- 相关素材来自于华为原生广告。
- 若有侵权或错误,请发送邮件至alphabetadata@163.com
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/addevelopment/892436.html