对于开发者来说,广告是一种拥有流量即可变现的低门槛变现方式。但对于用户来说,在使用App的过程中,广告数量过多,广告内容劣质,非常影响用户体验,甚至造成用户流失。那么开发者如何才能兼得广告变现和用户体验呢?使用原生广告就是很好的解决方法之一。

什么是原生广告

原生广告是创建与应用内容融于一体的广告形式,包含图片、文字和视频。原生广告将广告内容作为信息或服务内容的一部分植入到应用设计中,常见于信息流场景。

原生广告的优势

原生广告可以让广告在应用中看起来更自然。和Banner广告相比,原生广告对用户注意力影响较小,让用户有浑然一体的观看体验,减少广告对用户的干扰。

原生广告支持自定义界面,与其他广告格式相比,如何在App中展示广告方面,原生广告具有更高的灵活性,可以让广告主展示更多的广告内容。

原生广告支持自由定制界面,可以让用户在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

开发关键步骤

原生广告需要通过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();

更多应用内广告形式操作指南:
1、应用内添加Banner广告位
2、应用内添加激励广告
3、应用内添加原生广告
4、应用内添加开屏广告
5、应用内添加插屏广告
6、应用内添加贴片广告

>>访问华为广告服务官网,了解更多相关内容

>>获取华为广告服务开发指导文档

>>访问华为开发者联盟官网,了解更多相关内容

>>获取开发指导文档

>>华为移动服务开源仓库地址:GitHub、Gitee

关注我们,第一时间了解华为移动服务最新技术资讯~

应用内添加原生广告,变现与用户体验可兼得相关推荐

  1. 商业化广告--体系学习-- 11 -- 业务实战篇 --流量优化:如何兼顾广告收入和用户体验?

    广告产品的效果优化,需要从提升广告曝光量,也就是我们俗称的流量优化开始. 但是,流量优化,绝不仅仅是提高库存和占有率这么简单.这一讲,我们要学习的是流量优化的另一个重要方面:如何通过广告位的设计,兼顾 ...

  2. 2019极光开发者大会 | 高转化率和高用户体验如何兼得?一次聊透

    互联网行业里,产品和用户体验早已不是一个陌生的名词.从事产品.运营的小伙伴和相关负责人都需要快速掌握市场上的新玩法,了解市场上的新产品.想了解打造一款优秀的B端产品需要掌握哪些能力?想知道如何在不断提 ...

  3. 为余势负天工背,云原生内存数据库Tair助力用户体验优化

    简介:作为双11大促承载流量洪峰的利器,Tair支撑了电商交易核心体验场景.不仅在数十亿QPS的峰值下保持着亚毫秒级别的顺滑延迟,同时在电商交易核心体验场景上也做出了技术创新. 作者 | 漠冰 来源 ...

  4. 变现利器!一文带你学会应用内添加「贴片广告」

    什么是贴片广告 贴片广告是一种在视频播放过程中插入的视频或图片广告.视频广告一般是15s, 可以点跳过按钮直接进入视频播放界面,也可以等广告展示结束自动进入视频播放界面. 贴片广告的优势 相较于其他形 ...

  5. 应用内接入激励广告全步骤教程,助力流量高效变现

    什么是激励广告 激励广告是一种全屏幕的视频广告,用户可以选择点击观看,以换取相应奖励.常见的应用场景有,游戏中玩家因操作失误导致"死亡",为了获得复活机会,玩家选择观看弹出的激励广 ...

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

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

  7. 开发者收益路径—广告变现,App商业化如何有效增收?

    APP商业化变现,一直以来就是困扰APP开发者的最大问题,与国外APP付费使用模式相比,国内APP通常都是免费模式,除部分有商品或服务提供的APP,大多数APP无内购等可实现收益的商业模式,因此,开发 ...

  8. HMS-广告服务(原生广告)

    概述 原生广告是创建与应用内容融于一体的广告形式,支持开发者自由定制界面. 通过使用原生广告可以让应用界面UI更加友好,提升用户体验. 添加原生广告 定义广告布局 代码如下: <com.huaw ...

  9. 猫眼聚合——打造最优质的工具类APP广告变现方案

    ​在如今的时代,APP商业化变现的必然选择就是接入广告.然而,在考虑与广告对接时,我们需要更多地思考如何最大化收益,同时最小化对用户的干扰.特别是在工具类APP这类备受欢迎的应用中,如何实现广告变现已 ...

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

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

最新文章

  1. R绘制带显著性标记的热图
  2. [BZOJ 2243] 染色
  3. NLPPython笔记——WordNet
  4. 高通量数据中批次效应的鉴定和处理(二)
  5. 库克回应乔纳森离职:不影响苹果继续创新
  6. 1.视频全屏展示(适应各种屏幕尺寸)
  7. Android Studio生成签名文件和自动签名
  8. Python -- 扫描局域网活跃IP
  9. 高校计算机实验室安全自查报告,学校实验室安全检查自查报告
  10. FrameTime、FPS、流畅度、Jank
  11. 【5G NAS】5G SUPI 和 SUCI 标识符详解
  12. 使用贝叶斯优化工具实践XGBoost回归模型调参
  13. 中国企业在欧洲专利申请量高居第一名,凸显技术研发实力持续提升
  14. pcb过孔漏铜_过孔露铜改善评估报告
  15. linux 云备份恢复,Linux文件、目录及文件系统的备份与恢复相关命令
  16. CNN误差反传时旋转卷积核的简明分析
  17. .net windows service开发与安装
  18. 《未来简史》赫拉利:人工智能会成为人类史上重要的革命|2016 TGPC
  19. 社区生态 | openEuler、龙蜥Anolis、统信UOS三大主流操作系统下编译GreatSQL二进制包
  20. 【unity3D】 分享学习路上的一些坑(一)——商店导入的模型人物站上去看起来是飘着的;

热门文章

  1. Scroller类及scroll相关方法总结
  2. 矩阵分析:三角分解,QR分解,秩分解,奇异值分解
  3. 论文解读:预测lncRNA的相互作用生物分子类型:一种集成深度学习方法
  4. AU降噪 李兴兴
  5. 什么是前端,前端是什么?
  6. AlertManager 告警信息
  7. photoshop cc 2018破解补丁(pscc2018注册机) 附使用方法
  8. Java学习--多线程案例--模拟火车票销售(线程安全问题)
  9. android 计时器服务,启动时使用计时器/alarmclock,更新服务_android_开发99编程知识库...
  10. Qos服务质量与IntServ和DiffServ