hms-百家乐凯发k8
原生广告是创建与应用内容融于一体的广告形式,支持开发者自由定制界面。
通过使用原生广告可以让应用界面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.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