概述

原生广告是创建与应用内容融于一体的广告形式,支持开发者自由定制界面。

通过使用原生广告可以让应用界面UI更加友好,提升用户体验。

添加原生广告

定义广告布局

代码如下:

<com.huawei.hms.ads.nativead.NativeView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/tools"xmlns:hwads="http://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.NestedScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical">...<com.huawei.hms.ads.nativead.MediaViewandroid:id="@+id/ad_media_small"android:layout_width="75dp"android:layout_height="50dp" .../>...<com.huawei.hms.ads.nativead.MediaViewandroid:id="@+id/ad_media_large"android:layout_width="match_parent"android:layout_height="wrap_content" />...<com.huawei.hms.ads.nativead.MediaViewandroid: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() {@Overridepublic void onNativeAdLoaded(NativeAd nativeAd) {// 广告获取完成后调用NativeView nativeView = (NativeView) getRoot();mNativeAd = nativeAd;initNativeView(nativeAd,nativeView,nativeId);}}).setAdListener(new AdListener() {@Overridepublic void onAdFailed(int errorCode) {// 广告获取失败时调用...}});NativeAdLoader nativeAdLoader = builder.build();

其中nativeId是广告为ID。当获取广告成功后,SDK会调用NativeAd.NativeAdLoadedListener监听器的onNativeAdLoaded()方法返回NativeAd对象,此时开发者可以在此进行相关初始化操作。当获取广告失败后,SDK会调用AdListener监听器的onAdFailed()方法,此时开发者可以给出相关提示或隐藏相关广告布局等等,不至于降低用户体验度。

  • 加载广告
    NativeAdLoader提供loadAd()和loadAds()两种方法获取广告。
  1. loadAd()请求单个原生广告。AdParam是唯一的参数,AdParam不清楚可在HMS-广告服务(Banner广告)中进行查看,代码如下:
    // loadAd()请求单个原生广告。nativeAdLoader.loadAd(new AdParam.Builder().build());
  1. loadAds()请求多个原生广告。loadAds()请求有两个参数,除AdParam外,还有请求加载的广告数量,最大为5。SDK返回的广告数量将会小于等于所请求的广告数量,并且广告皆不相同。
      // loadAds()请求多个原生广告nativeAdLoader.loadAds(new AdParam.Builder().build(), 5);

调用loadAds()后,监听器将会根据返回的广告个数进行多次回调。请求多个广告时,可以在回调代码中使用NativeAdLoader.isLoading()方法来判断广告是否已获取完成。再次使用NativeAdLoader获取广告前,请确保先前的请求已经完成。

初始化

  • 参数配置
  1. 如果广告中除了包含图片、文字外,还包含视频素材,需要通过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”的显示位置等等。

  1. 如果想在视频播放过程中进行其他操作,可以通过VideoOperator类获取视频信息和视频控制。控制器实例需要通过调用NativeAd.getVideoOperator()方法获得。当广告中没有视频素材时,此方法也会返回VideoOperator对象。
VideoOperator videoOperator = nativeAd.getVideoOperator();

VideoOperator提供hasVideo()方法判断广告中是否有视频素材。

  1. 监听视频播放,通过实现VideoOperator.VideoLifecycleListener类可以监听视频播放过程中的事件:
        videoOperator.setVideoLifecycleListener(new VideoOperator.VideoLifecycleListener() {@Overridepublic void onVideoEnd() {// 视频播放完时调用super.onVideoEnd();}});
  1. 如果不想展示“广告已关闭”的视图,可调用NativeAd类中的setDislikeAdListener()方法为原生广告对象设置关闭广告事件监听器,并在监听器中的onAdDisliked()方法中添加自定义实现。当广告关闭时,SDK会回调监听器中的onAdDisliked()方法。
     nativeAd.setDislikeAdListener(new DislikeAdListener() {@Overridepublic void onAdDisliked() {...}});
  1. 自定义版“不再显示该广告”,通过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布局中。

销毁

当原生广告不再展示时,应将其销毁。

    @Overridepublic 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

HMS-广告服务(原生广告)相关推荐

  1. 百度联盟广告代码php,百度联盟原生广告的投放步骤

    昨天无聊之余就用懿古今申请了360联盟和百度联盟,今天早上都已经全部通过申请.在设置360联盟广告样式的时候只有标签页和排行榜选择,而在设置百度联盟的时候竟然可以投放原生广告,它的样式多了很多,所以今 ...

  2. ADMob 原生广告展示不完全,mediaView无图片数据

    最近在接goggle的广告模块,遇到一些杂七杂八的问题,在此进行一些记录. 在接入原生广告时,比如在splash 请求一个原生广告,然后缓存起来,跳转带首页展示一个原生广告,结果遇到了广告展示不完全的 ...

  3. 【资源】什么是原生广告 What Is Native Advertising?

    编者按:本文由DamnDigital授权SocialBeta转载.原生广告日益受到品牌商的关注,这正是因为优质内容对受众的吸引力是传统广告无法比拟的.同时,诸如点击率.逗留时间等指标也被用来衡量原生广 ...

  4. 2017年原生广告程序化购买将成为新趋势

    原生广告一直是一个很宽泛的概念,几乎无所不包.但是,2017年这个概念将被明确分为两类:程序化购买和非程序化购买.         根据eMarketer最新的"2017年美国展示广告趋势& ...

  5. android 原生广告制作,创建横幅、原生广告 · adtalos/android-xy-sdk-demo Wiki · GitHub

    创建横幅和原生广告的方式是相同的,它们都是使用相同的 com.xy.sdk.View 来创建,只是属性值有所区别. 注意:这里 com.xy.sdk 是默认的包名.您在使用时,请替换为您在 cms 开 ...

  6. Android FaceBook原生广告接入教程(精简版)

    公司项目主要做海外市场,并且是资讯类的产品,所以接入一些广告公司的广告是一项不错的创收,昨天下午产品告诉我要马上接入Facebook的原生广告需求,于是下午就开始阅读Facebook广告接入的官方开发 ...

  7. AdMob(app内嵌广告)原生广告

    原生广告 原生格式是一种基于组件的广告格式,可让发布商自由地自定义在应用中如何呈现广告资源,如标题及对操作的调用.通过选择适合自己的字体.颜色和其他详细信息,发布商能够制作出自然而然.毫不唐突的广告演 ...

  8. Unity 之 最新原生广告Ads接入 -- 助力增长游戏收益

    Unity 之 最新Ads原生广告接入流程详解和工具类分享 一,注册 Unity Ads 广告 SDK 二,下载 Unity Ads 广告 SDK 三,配置 Unity Ads 广告 SDK 3.1 ...

  9. 脑洞模式:原生广告的新玩法

    这种类原生广告(毕竟原生广告通篇都是广告)的脑洞模式,有没有巨大的前景? 没有. 但这不重要. id="cproIframe_u1435428_2" width="250 ...

最新文章

  1. 如何在一个背景图像上,做半透明的图。
  2. 【题解】 hdu2955 Robberies
  3. node mysql 多个_使用Node.js处理多个MySQL查询
  4. 数据库复习之规范化理论应用(第八次上机内容)
  5. 腾讯汤道生:开源已成为许多技术驱动型产业重要的创新推动力
  6. 颜宁课题组再发Cell!1个月时间内4篇顶刊!
  7. Go实现简单的RESTful_API
  8. 跨域技术(JSONP与CROS)
  9. 《Cracking the Coding Interview》——第9章:递归和动态规划——题目8
  10. Wordpress固定链接伪静态
  11. 微软 SQL Server 2016 迁移技术培训实验营
  12. 百度地图json_R: 民政部官网市级行政地图的绘制
  13. 研磨设计模式之简单工厂模式
  14. HTTP网页URL链接的语法格式最详细的分析与介绍
  15. emi软件测试,电磁干扰EMI的测试标准及应用
  16. 阿里云数据库(RDS)是什么,与传统数据库有什么区别?
  17. java中BOM是什么_Java-BOM与DOM对象
  18. vb.net html图片,手把手教你VB.NET DataGrid图片显示
  19. 极速掌握HTML(一)基础入门
  20. 业界分享 | 京东推荐算法精排技术实践

热门文章

  1. Lunascape:将FireFox、Safari和IE合为一体的浏览器
  2. IT业十大热门职位介绍
  3. centos 配置ntp时间同步服务
  4. JavaScript基础入门-陈璇-专题视频课程
  5. 平安科技安全产品经理面试经历分享
  6. stein算法(求gcd)
  7. java使用 xdocreport,以 docx 模板方式进行 docx 文档的下载
  8. python 多线程对post请求服务器测试并发
  9. 汇川伺服电机位置控制模式QT程序Demo实现
  10. 装修技术贴,不要装修完后悔的79件事