DU Ad Platform_SDK for Android 接 入 手册 Version: DUAd_SDK_HW1.2.7 DU Ad Platform_SDK for Android 接 入 手册 1. 概述 1.1 读者对象 1.2 前提 2. 接 入流程 3. 获取身份 3.1 APP_ID 3.2 广告位 ID 3.3 Facebook Placement_ID( 可选 ) 3.4 AdMob_ID( 可选 ) 4. 加载与配置 4.1 加载 DU Ad Platform_SDK 压缩包 4.2 配置 AndroidManifest.xml 4.3 混淆代码 4.4 Kotlin 加载 ( 可选 ) 5. 初始化 6. 控制 用户信息获取许可状态 6.1 用户信息获取许可状态的设置接 口 6.2 用户信息获取许可状态的获取接 口 7. 获取原 生 广告数据 7.1 构造原 生 广告数据类接 口 7.2 注册 广告数据监听回调接 口 7.3 获取 广告数据接 口 7.4 销毁原 生 广告对象 8. 原 生 广告数据介绍 8.1 构成元素 8.2 数据获取接 口 8.3 AdMob 数据获取接 口 9. 注册原 生 广告 View 监听 10. 原 生 广告 List 使 用 10.1 构造原 生 广告 List 使 用类 10.2 构造 子原 生 广告类 10.3 注册原 生 广告 List 监听接 口 10.4 注册原 生 广告 子类监听接 口 10.5 获取 广告数据接 口 10.6 原 生 广告数据获取 10.7 销毁原 生 广告 List 对象 11. 常 见问题 11.1 SDK 接 入 11.2 平台
11.3 广告 11.4 其他 1. 概述 本 文档描述如何在安卓应 用中接 入来 自百度开发者平台的 DU Ad Platform_SDK 产品 DAP 开发者平台可以为应 用提供 广告服务 DU Ad Platform_SDK 是百度开发者平台中 用来提供原 生 广告的 一款产品 1.1 读者对象 本 文档 面向的读者是安卓应 用的开发者 1.2 前提 DU Ad Platform_SDK 目前 支持 Android2.3 API Level9( 含 ) 以上的系统版本 2. 接 入流程 DU Ad Platform_SDK 的接 入流程如下 : 1. 申请 广告 ID 2. 导 入 DU Ad Platform_SDK 工程包 3. 初始化 DU Ad Platform_SDK 4. 广告接 入 5. 完成接 入 3. 获取身份 本章描述 DU Ad Platform_SDK 接 入过程中需要的四个身份 :APP_ID, 广告位 ID,Facebook Placement_ID,AdMob_ID 3.1 APP_ID 1. 定义 APP_ID 是开发者的应 用在 DAP 广告平台的唯 一标识 2. 获取 方式
访问 DAP 开发者平台进 行行申请 3. 代码 app_license 3.2 广告位 ID 1. 定义 广告位 ID 是 DAP 开发者平台上 广告所在的 广告位置的标识 开发者可以为 一个应 用创建多个 广告位 2. 获取 方式访问 DAP 开发者平台进 行行申请 3. 代码 pid 3.3 Facebook Placement_ID( 可选 ) 1. 定义 Facebook Placement_ID 是 Facebook 广告所在 广告位置的标识 使 用 DAP 聚合 Facebook 广告时才需要 Facebook Placement_ID 2. 获取 方式访问 Facebook 开发者平台进 行行申请
3. 代码 fbids 3.4 AdMob_ID( 可选 ) 1. 定义 AdMob_ID 是开发者应 用在 AdMob 广告平台的唯 一标识 使 用 DAP 聚合 AdMob 广告时才需要 AdMob_ID 2. 获取 方式访问 AdMob 广告平台进 行行申请 3. 代码 amid 4. 加载与配置 本章描述在安卓应 用中如何加载 DU Ad Platform_SDK 的压缩包, 如何配置 AndroidManifest.xml, 以及根据项 目需要配置混淆代码 请严格按照本章进 行行配置, 否则有可能会出现运 行行异常 4.1 加载 DU Ad Platform_SDK 压缩包 1. 下载 DU Ad Platform_SDK 的压缩包 2. 解压 DU Ad Platform_SDK 的压缩包 解压后有两个 子 目录 文件夹, 名称和内容如下 : DUAd_SDK: 该 文件夹存放 DU Ad Platform_SDK 的 aar 包 :DuappsAd-HW-xxx.aar DUAd_SDK_DEMO 该 文件夹存放使 用 DU Ad Platform_SDK 过程中的示例例程序 本 文档中所有接 口都可以在 DUAd_SDK_DEMO 中找到对应的使 用示例例 3. 加载 DU Ad Platform_SDK: Android Studio 导 入 : 拷 贝 SDK aar 包放到你的安卓 工程 文件根 目录的 libs 目录下, 然后配置 build.gradle :
repositories { flatdir { dirs 'libs' dependencies { compile filetree(include: ['*.jar'], dir: 'libs') compile(name: 'DuappsAd-HW-xxx-release', ext: 'aar') * 注 : flatdir 指定的位置即为 aar 存放的位置 Eclipse 导 入 : 1. 将 DuappsAd-HW-xxx.aar 后缀改成 zip 解压 2. 将 classes.jar 拷进 libs 目录下注 : 使 用 DAP 进 行行聚合 Facebook 和 AdMob 广告时需要额外添加对应的依赖 4.2 配置 AndroidManifest.xml 在安卓 工程 目录下, 打开 AndroidManifest.xml, 配置以下内容 : 1. 添加权限 DU Ad Platform_SDK 使 用的最低权限如下 : <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="android.permission.access_network_state" /> 2. 在 app_license 的 value 中填 入已申请的 APP_ID <application android:name="com.mobula.sample.mobulaapplication" android:usescleartexttraffic="true" //target SDK 28 要添加 android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/mobulatheme" > <meta-data android:name="app_license" android:value="your_app_license" /> <provider android:name="com.duapps.ad.stats.duadcacheprovider" android:authorities="${applicationid.duadcacheprovider" android:exported="false"> </provider> </application>
注 : applicationid 必须与平台注册的应 用包名 一致, 否则将 无法获得 广告 ; applicationid 在 build.gradle 中设置 ; 平台的应 用包名 见下图 3. 使 用 AdMob 广告时需额外添加以下 Activity 不不使 用时不不 用添加 <!--Admob begin--> <activity android:name="com.google.android.gms.ads.adactivity" android:configchanges="keyboard keyboardhidden orientation screenlayout uimode screensize smallestscreensize" android:theme="@android:style/theme.translucent" /> 4. 为了了适配 Android 9.0 (target SDK 28), 需要在 Application 标签下添 加 android:usescleartexttraffic="true" 来解析 非 https 的 广告链接 4.3 混淆代码 请务必按如下混淆规则对应 用代码进 行行混淆, 否则有可能会出现运 行行异常 : 1. 将以下类添加到 proguard 配置 : -keep class com.duapps.ad.**{*; -dontwarn com.duapps.ad.**
-keep public class * extends android.content.broadcastreceiver -keep public class * extends android.content.contentprovider -keepnames @com.google.android.gms.common.annotation.keepname class * -keepclassmembernames class * { @com.google.android.gms.common.annotation.keepname *; -keep class com.google.android.gms.common.googleplayservicesutil { public <methods>; -keep class com.google.android.gms.ads.identifier.advertisingidclient { public <methods>; -keep class com.google.android.gms.ads.identifier.advertisingidclient$info { public <methods>; 注 : 混淆 方法参 见 Android 官 方混淆 文档 :${ android-sdk /tools/proguard/ 2. 如接 入 Facebook 广告, 须将以下类添加到 proguard 配置 : -keep class com.facebook.ads.nativead 3. 如接 入 AdMob 广告, 须将以下类添加到 proguard 配置 -keep public class com.google.android.gms.ads.** {public *; 4.4 Kotlin 加载 ( 可选 ) 接 入 Kotlin 应 用的时候, 除了了上述步骤之外, 还需要额外进 行行如下配置 1. 在 app 下的 build.gradle 中加 入 : apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions'... dependencies{... implementation "org.jetbrains.kotlin:kotlin-stdlibjre7:$kotlin_version" 2. 在 project 下的 build.gradle 中加 入 :
buildscript { xt.kotlin_version = '1.2.51'... dependencies { classpath "org.jetbrains.kotlin:kotlin-gradleplugin:$kotlin_version"... 5. 初始化 在完成 DU Ad Platform_SDK 接 入操作之前, 应 用 首先需要对 DU Ad Platform_SDK 做初始化 没有进 行行初始化的 广告位 id 无法拉取 广告 1. 创建 Json 文件, 将 Placement_ID 与 广告位 ID 建 立对应关系 具体格式如下 : { "native": [ { "pid":"your_dap_placement_id", { "pid":"your_dap_placement_id", "fbids": [ "YOUR_FACEBOOK_PLACEMENT_ID" ], "amid":"your_admob_ad_id" ], "list": [ { "pid": "YOUR_DAP_PLACEMENT_ID", "fbids":"your_facebook_placement_id" ] 注 : 1. 如果某 广告位不不需要 Facebook 广告, 请将该 广告位对应的 "fbids" 部分删除 如需绑定 FBID, 请确保 Facebook Audience Network 版本不不低于 FB 4.23.0 2. 如果开发者某 广告位不不需要 AdMob 广告, 请将该 广告位对应的 "amid" 部分删除 3. 原 生 广告 List 暂时不不 支持 AdMob 聚合 4. 如果不不希望通过静态创建 json 文件的 方式进 行行初始化, 可以直接创建符合 json 格式的字符串串并传值
2. 为发送请求时的包名信息添加后缀 接 口说明 : DuAdNetwork.setSource(String sourcename) 参数 String sourcename 说明 所添加的包名后缀 注 : 该 方法需要在 DuAdNetwork.init() 前进 行行调 用 3. 在 application 的 OnCreate() 方法中使 用 DuAdNetwork.init() 接 口说明 : public static void init(context context,string pidsjson) 参数 Context context String pidsjson 说明 ACTIVITY CONTEXT Placement_ID 与 广告位 ID 的对应关系 Java 代码示例例 : public void oncreate() { super.oncreate(); // 初始化 SDK DuAdNetwork.init(this, getconfigjson(getapplicationcontext())); //DuAdNetwork.setLaunchChannel("YOUR_APP_CHANNEL"); // 从 assets 中读取 txt private String getconfigjson(context context) { BufferedInputStream bis = null; ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { bis = new BufferedInputStream(context.getAssets().open("json.txt")); byte[] buffer = new byte[4096]; int readlen = -1; while ((readlen = bis.read(buffer)) > 0) { bos.write(buffer, 0, readlen); catch (IOException e) { Log.e("", "IOException :" + e.getmessage()); finally { closequietly(bis);
return bos.tostring(); Kotlin 代码示例例 : override fun oncreate() { super.oncreate() DuAdNetwork.setConsentStatus(this, true) DuAdNetwork.getConsentStatus(this) /** * the sdk initialization 初始化 SDK */ DuAdNetwork.init(this, getconfigjson(getapplicationcontext())) fun getconfigjson(context: Context): String { var bos = ByteArrayOutputStream() var bis = BufferedInputStream(context.assets.open("json.txt")) try { var readlen = -1 while (bis.read().also { readlen = it!= -1) { bos.write(readlen) catch (e: Exception) { Log.e("", "IOException :" + e.message) finally { closequietly(bis) return bos.tostring() 4. 填写投放渠道 用以区分不不同 app 投放渠道的数据, 此接 口可选择使 用, 不不是必需 在 application 的 OnCreate() 方法中使 用 DuAdNetwork.setLaunchChannel() 接 口说明 : public static void setlaunchchannel (String channelname) 参数 String channelname 说明 此接 口可以帮你根据你的 APP 投放渠道, 区分数据 6. 控制 用户信息获取许可状态 此配置为针对 GDPR 做出的修改, 适 用于需要进 行行 用户信息获取许可状态配置的地区, 为可选配置
6.1 用户信息获取许可状态的设置接 口 建议在初始化时调 用该接 口 接 口说明 : public static void setconsentstatus(context context, boolean consentstatus) 参数 Context context boolean consentstatus 说明 ACTIVITY CONTEXT 用户许可状态 true: 获得了了 用户授权时传 入, 可以按正常 方式请求和展示 广告 false: 用户拒绝授权或收回授权时传 入, 广告请求直接返回 4000( 见 7.2 错误码 ) 6.2 用户信息获取许可状态的获取接 口 接 口说明 : public static boolean getconsentstatus(context context) 获取当前 用户信息获取许可状态, 允许收集 用户信息则返回 True, 否则返回 False 7. 获取原 生 广告数据 本章描述如何获取 广告数据 包括构造 广告数据类接 口, 注册 广告数据监听回调, 和获取 广告数据接 口三个部分 7.1 构造原 生 广告数据类接 口 步骤如下 : 1. 构造原 生 广告类创建原 生 广告对象必须指定对应的 广告位 ID 不不同的 广告位会获取到不不同的 广告数据 2. 设置 广告缓存个数 广告缓存个数可以设置 1-5 个 推荐不不设置 广告缓存个数 如果不不设置或者设置 无效值, 会使 用默认缓存 :1 个 注 : 此 方法只在通过 DU Ad Platform 聚合其他渠道时 生效 接 口说明 : public DuNativeAd (Context context, int pid) public DuNativeAd (Context context, int pid, int cachesize)
参数 Context context int pid int cachesize 说明 ACTIVITY CONTEXT 广告位 ID, 该 pid 注册在 Json 的 native 数组中缓存 广告个数 7.2 注册 广告数据监听回调接 口 广告数据获取与点击事件的响应均通过回调接 口返回 此过程与 广告数据获取过程异步, 不不会阻塞开发 者的线程 接 口说明 : public void setmobulaadlistener(duadlistener adlistener) 参数 DuAdListener adlistener 说明 回调函数返回获取 广告错误, 获取 广告的数据, 广告点击事件 public interface DuAdListener { public void onerror(dunativead ad, AdError error); public void onadloaded(dunativead ad); public void onclick(dunativead ad); 使 用获取数据 方法后,DU Ad Platform_SDK 会在回调函数中通知开发者获取 广告数据的结果 获取 广告成功 DU Ad Platform_SDK 会回调 onadloaded() 方法, 通过 DuNativeAd 的对象开发者可以得到具体的 广告数据内容 获取 广告失败 DU Ad Platform_SDK 会回调 onerror() 方法, 通过 AdError 对象开发者可以得到具体错误信息 获取 广告数据失败的错误码及含义如下 :
常量量 错误码 说明 NETWORK_ERROR_CODE 1000 客户端 网络错误 NO_FILL_ERROR_CODE 1001 没有获取到 广告数据 LOAD_TOO_FREQUENTLY_ERROR_CODE 1002 请求接 口过频繁 IMPRESSION_LIMIT_ERROR_CODE 1003 展示超出限制 SERVER_ERROR_CODE 2000 服务器器错误 INTERNAL_ERROR_CODE 2001 服务器器 网络错误 TIME_OUT_CODE 3000 获取 广告数据等待时间超时 UNKNOW_ERROR_CODE 3001 未知错误 NO_USER_CONSENT_ERROR_CODE 4000 用户信息获取未受到许可 获取 广告点击事件 DU Ad Platform_SDK 会回调 onclick() 方法, 通知开发者该 DuNativeAd 的对象的 广告被点 击 7.3 获取 广告数据接 口 开发者可根据 自 己产品的需求, 选择时机获取 广告数据 接 口说明 : public void fill() 调 用 fill() 接 口可以提前缓存 广告, 在 load() 广告时可以更更快获取 建议在 广告展示的前置场景调 用该 方法 注 : 广告数据会缓存到客户端内存中, 不不会缓存 广告的图 片数据, 只会缓存图 片的 Url 地址, 缓存数据量量 小 public void load() 异步获取 广告对象数据, 没有缓存时会进 行行 广告请求 建议在使 用 load() 后再次调 用 fill() 接 口进 行行 广告缓存 public DuNativeAd getcachead() 同步获取 广告对象数据 可以循环拿取, 一直到 广告缓存为 0
在使 用该接 口展示 广告时, 请进 行行缓存 非空判断, 避免缓存池为空导致空指针 建议在使 用 get() 后再次调 用 fill() 接 口进 行行 广告缓存 public boolean ishascached() 获取当前是否有 广告缓存, 有缓存则返回 True Java 代码示例例 DuNativeAd nativead = new DuNativeAd(this, PID, CACHESZIE); if (nativead!= null) { nativead.setmobulaadlistener (mlistener); nativead.load(); DuAdListener mlistener = new DuAdListener () { @Override public void onerror (DuNativeAd ad, AdError error) { Log.d(TAG, "onerror : " + error.geterrorcode()); @Override public void onclick (DuNativeAd ad) { Log.d(TAG, "onclick : click ad"); @Override public void onadloaded (final DuNativeAd ad) { Log.d(TAG, "onadloaded : " + ad.gettitle()); ; Kotlin 代码示例例 : lateinit var nativead: DuNativeAd nativead = DuNativeAd(this, PID, DEFAULT_CACHE_SIZE); nativead.setmobulaadlistener(mlistener) nativead.load() var mlistener = object : DuAdListener { override fun onclick(p0: DuNativeAd?) { Log.d(TAG, "onclick") override fun onerror(p0: DuNativeAd?, p1: AdError?) {
Log.d(TAG, "onerror") override fun onadloaded(ad: DuNativeAd?) { Log.d(TAG, "onadloaded") 7.4 销毁原 生 广告对象 在退出原 生 广告展示界 面时, 建议销毁原 生 广告对象 接 口说明 : public void destroy() 8. 原 生 广告数据介绍 本章描述 广告数据的构成元素及构成元素的获取接 口 8.1 构成元素 广告数据的构成元素包括图标, 标题,CTA 按钮, 宣传 文案, 评价和宣传图 1. 图标 2. 标题 3. CTA 按钮 4. 宣传 文案 5. 评价 8.2 数据获取接 口 图标获取接 口 public String geticonurl() 返回 广告图标的 Url 地址
标题获取接 口 public String gettitle() 返回标题 文案 广告中必须包含 一个标题 请保留留 至少 20 个字符的空间 用来显示标题, 可以 用省略略号代替超出的 文本 CTA 按钮获取接 口 public String getcalltoaction() 返回 CTA 按钮 文案 广告中必须包含 一个触发按钮 请不不要缩短或改变按钮 文案 按钮 文案的最 大字符 长度个数 :25 宣传 文案获取接 口 public String getshortdesc() 返回 广告的宣传 文案 需确保有 72 个字符可以被显示 如果 广告区域不不 足以显示 72 个字符, 建议不不要在 广告中添加宣传 文案, 或者使 用滚动 文本效果, 让全部宣传 文案能够被显示 评级获取接 口 public float getratings() 返回该 广告应 用在 Google Play 上的评级 宣传图获取接 口 public String getimageurl() 返回 广告宣传图的 Url 地址 广告中可以添加宣传图 片, 促进 用户点击 广告的欲望 可以缩放和裁剪宣传图的 一部分, 但请不不要扭曲和改变它 宣传图的 大 小通常是 :796*416 像素 ( 比例例为 1.91:1) DuAdChoicesView
该 View 是 Facebook 原 生 广告返回的 AdChoices 角标 使 用 Facebook 原 生 广告时必须添加的元素, 非 Facebook 原 生 广告不不 用添加 构造 方法 : public DuAdChoicesView(Context mcontext, DuNativeAd mnativead, boolean isexpand) 参数 Context mcontext DuNativeAd mnativead boolean isexpand 说明 ACTIVITY CONTEXT 原 生 广告对象控制 AdChoises 角标是否可扩展, 推荐值为 True Java 代码示例例 : import com.duapps.ad.duadmediaview; import com.duapps.ad.duadchoicesview; LinearLayout adchoicescontainer = (LinearLayout) findviewbyid(r.id.ad_choices_container); if (mnativead.getadchanneltype() == DuNativeAd.CHANNEL_TYPE_FB) { DuAdChoicesView choicesview = new DuAdChoicesView(getApplicationContext(), mnativead, true); adchoicescontainer.addview(adchoicesview); DuAdMediaView mmediaview = new DuAdMediaView(this); mmediaview.setautoplay(true); mmediaview.setnativead(mnativead.getrealsource()); Kotlin 代码示例例 : import com.duapps.ad.duadmediaview; import com.duapps.ad.duadchoicesview; if (mnativead.getadchanneltype() == DuNativeAd.CHANNEL_TYPE_FB) { var choicesview=duadchoicesview(getapplicationcontext(),mnativead,true) ad_choices_container.addview(adchoicesview) var mmediaview = DuAdMediaView(this).apply{ setautoplay(true) setnativead(mnativead.getrealsource())
8.3 AdMob 数据获取接 口 AdMob 原 生 广告分为两种类型 :AppInstall 类型和 Content 类型 在拿到 广告数据后请先对 广告类型进 行行判断 请在 onadloaded() 回调中调 用该 方法, 具体使 用可参照 demo public int getadchanneltype() Java 代码示例例 : if (ad.getadchanneltype() == DuNativeAd.CHANNEL_TYPE_AM_INSTALL) { //AppInstall 类型 广告, 需要动态使 用 Admob 提供的 NativeAppInstallAdView if (lp == null) { lp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); if (installadview == null) { installadview = new NativeAppInstallAdView(ShowADCardActivity.this); installadview.setheadlineview(titleview); installadview.seticonview(iconview); installadview.setbodyview(descview); installadview.setmediaview(bigimgview); installadview.setstarratingview(ratingview); installadview.setcalltoactionview(btnview); installadview.addview(rl, lp); fl.addview(installadview); nativead.registerviewforinteraction(installadview); else if(ad.getadchanneltype() == DuNativeAd.CHANNEL_TYPE_AM_CONTENT){ //Content 类型 广告, 需要动态使 用 AdMob 提供的 NativeContentAdView if (lp == null) { lp = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); if (contentadview == null) { contentadview = new NativeContentAdView(ShowADCardActivity.this); contentadview.setheadlineview(titleview); contentadview.setlogoview(iconview); contentadview.setbodyview(descview); contentadview.setmediaview(bigimgview); contentadview.setcalltoactionview(btnview); contentadview.addview(rl, lp); fl.addview(contentadview); nativead.registerviewforinteraction(contentadview); else { // 广告类型是 DuNativeAd.DAP_NORMAL_AD( FB & DU ) 的时候, 请按普通 方式注册 广告 View. fl.addview(rl);
nativead.registerviewforinteraction(bigimgcontainer); Kotlin 代码示例例 : if (ad?.getadchanneltype() == DuNativeAd.CHANNEL_TYPE_AM_INSTALL) { if (lp == null) { lp = LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT) if (installadview == null) { installadview = NativeAppInstallAdView(this@ShowADCardKotlinActivity) installadview.setheadlineview(titleview); installadview.seticonview(iconview); installadview.setbodyview(descview); installadview.setimageview(bigimgview); installadview.setstarratingview(ratingview); installadview.setcalltoactionview(btnview); installadview.addview(rl, lp); adlayout.removeallviews() adlayout.addview(installadview) /* When registering the View of Ad in type Admob- AppInstall, NativeAppInstallAdView need to be registered. * Otherwise, clicking the Ad will be failed and the impression of Ad will be invalid. */ /* 注册 admob AppInstall 类型 广告 View 的时候, 需要注册 NativeAppInstallAdView, * 否则 广告 无法点击跳转, 此展示 无效. */ nativead.registerviewforinteraction(installadview); // If the type of AD is Admob- Content, then dynamically use the NativeContentAdView provided by Admob // 判断 广告类型, 如果是 admob 的 content 类型 广告, 则动态使 用 admob 提供的 NativeContentAdView else if (ad?.getadchanneltype() == DuNativeAd.CHANNEL_TYPE_AM_CONTENT) { if (lp == null) { lp = LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); if (contentadview == null) { contentadview = NativeContentAdView(this@ShowADCardKotlinActivity) contentadview.headlineview = titleview contentadview.logoview = iconview
contentadview.bodyview = descview contentadview.imageview = bigimgview contentadview.calltoactionview = btnview contentadview.addview(rl, lp); adlayout.removeallviews() adlayout.addview(contentadview); /* When registering the View of Ad in type Admob- Content, NativeContentAdView need to be registered. * Otherwise, clicking the Ad will be failed and the impression of Ad will be invalid. */ /* 注册 admob content 类型 广告 View 的时候, 需要注册 NativeContentAdView, * 否则 广告 无法点击跳转, 此展示 无效. */ nativead.registerviewforinteraction(contentadview); // If the type of Ad is Facebook or DU, please use the below method to register the View. // 广告类型是 DuNativeAd.DAP_NORMAL_AD( FB & DU ) 的时候, 请按下 面 方式注册 广告 View. else { adlayout.addview(rl); nativead.registerviewforinteraction(bigimgcontainer); 9. 注册原 生 广告 View 监听 DU Ad Platform_SDK 会 自动统计 广告的展示和被点击次数, 开发者必须注册 广告可点击区域视图的监 听 接 口说明 : public void registerviewforinteraction(view view) public void registerviewforinteraction(view view, List<View> views) 参数 View view List <View> views 说明 广告内容中可点击的 view 更更细致的 子 view * 注 : 不不建议在多线程使 用此接 口
10. 原 生 广告 List 使 用 建议需要同时展示多条原 生 广告时使 用该 方法. 10.1 构造原 生 广告 List 使 用类 接 口说明 : public DuNativeAdsManager(Context context, int pid, int cachesize) 参数 Context context int pid int cachesize 说明 ACTIVITY CONTEXT 广告位 ID, 该 pid 注册在 Json 的 List 数组中缓存 广告个数 10.2 构造 子原 生 广告类 public NativeAd() 10.3 注册原 生 广告 List 监听接 口 接 口说明 : public void setlistener(adlistarrivallistener adlistener) 参数 AdListArrivalListener adlistener 说明 回调函数返回获取 广告错误, 获取 广告的数据 public interface AdListArrivalListener { public void onerror(aderror error); public void onadloaded(list<nativead> mnativead); 使 用获取数据 方法后,DU Ad Platform_SDK 会在回调函数中通知开发者获取 广告数据的结果 获取 广告成功 DU Ad Platform_SDK 会回调 onadloaded() 方法, 通过 List<NativeAd> 的对象开发者可以得到每个 广告对象, 并分别获得对应的 广告元素获取 广告失败 DU Ad Platform_SDK 会回调 onerror() 方法, 通过 AdError 对象开发者可以得到具体错误信息
10.4 注册原 生 广告 子类监听接 口 接 口说明 : public void setmobulaadlistener(duaddatacallback mcallback) 参数 DuAdDataCallBack mcallback 说明 此接 口可以获得单个 广告点击事件, onadloaded(), onaderror() 已 经由 AdListArrivalListener 回调, 在该接 口 无返回 public interface DuAdDataCallBack { public void onerror(aderror error); public void onadloaded(nativead mnativead); public void onadclick(); 获取 广告点击事件 DU Ad Platform_SDK 会回调 onclick() 方法, 通知开发者该 NativeAd 的对象的 广告被点击 Java 代码示例例 : private NativeAd mnativead; private LinkedList<NativeAd> lists = new LinkedList<NativeAd>(); private DuNativeAdsManager adsmanager = = new DuNativeAdsManager(getApplicationContext(), PID, CACHESZIE); @Override protected void onresume() { super.onresume(); if (adsmanager!= null) { adsmanager.setlistener(listener); adsmanager.load(); mnativead = lists.get(mpositon); mnativead.setmobulaadlistener(callback); mnativead.registerviewforinteraction(btnview); AdListArrivalListener listener = new AdListArrivalListener() { NativeAd nativead; // 返回 广告 list @Override public void onadloaded(list arg0) {
for (int i = 0; i < arg0.size(); i++) { // 获取单个 广告对象 nativead = (NativeAd) arg0.get(i); if (!(nativead.equals(null))) { lists.add(nativead); // 返回 广告错误码 @Override public void onaderror(aderror arg0) { Log.d(TAG, "onerror : " + arg0.geterrorcode()); ; DuAdDataCallBack callback = new DuAdDataCallBack() { @Override public void onadloaded(nativead data) { @Override public void onaderror(aderror error) { @Override public void onadclick() { Log.d(TAG, "onclick : click list ad"); ; Kotlin 代码示例例 : lateinit var mdunativeadsmanager: DuNativeAdsManager val madlist = arraylistof<nativead>() lateinit var mnativead: NativeAd override fun oncreate(savedinstancestate: Bundle?) { super.oncreate(savedinstancestate) mdunativeadsmanager = DuNativeAdsManager(this, PID, CACHESIZE).apply { setlistener((object : AdListArrivalListener { override fun onadloaded(p0: MutableList<NativeAd>?) { Log.d(TAG, "onadloaded") madlist?.clear() p0?.foreach { if (it!= null) madlist.add(it) if (madlist.size == CACHESIZE) { mhandler.apply {
removecallbacksandmessages(null) post(mrunnable) override fun onaderror(p0: AdError?) { Log.d(TAG, "onerror : " + p0?.geterrorcode()); )) Log.d(TAG, "load list ad...") mdunativeadsmanager.load() private val mrunnable = object : Runnable { override fun run() { if (mpositon < madlist.size) { mnativead = madlist.get(mpositon); mnativead.setmobulaadlistener(callback); val url = mnativead.adcoverimageurl if (url.isempty()) showsmalladview(mnativead) else showbigadview(mnativead) mpositon++ else { mpositon = 0 mhandler.postdelayed(this, 8000) var callback = (object : DuAdDataCallBack { override fun onadclick() { Log.d(TAG, "onclick : click list ad"); override fun onadloaded(p0: NativeAd?) { Log.d(TAG, "onadloaded: adloead list ad") ) override fun onaderror(p0: AdError?) { Log.d(TAG, "onaderror: onaderror list ad:" + p0.tostring())
10.5 获取 广告数据接 口 接 口说明 : public void fill() 开发者可根据 自 己产品的需求, 选择时机使 用填充 广告缓存接 口 调 用 fill() 接 口可以提前缓存 广告, 在 load() 广告时可以更更快展示 建议在 广告展示的前置场景调 用该 方法 注 : 广告数据会缓存到客户端内存中, 不不会缓存 广告的图 片数据, 只会缓存图 片的 Url 地址, 缓存数据量量 小 public void load() 异步获取 广告对象数据, 没有缓存时会进 行行 广告请求 10.6 原 生 广告数据获取 图标获取接 口 public String getadiconurl() 返回 广告图标的 Url 地址 标题获取接 口 public String getadtitle() 返回标题 文案 广告中必须包含 一个标题 请保留留 至少 20 个字符的空间 用来显示标题, 可以 用省略略号代替超出的 文本 CTA 按钮获取接 口 public String getadcalltoaction() 返回 CTA 按钮 文案 广告中必须包含 一个触发按钮 请不不要缩短或改变按钮 文案 按钮 文案的最 大字符 长度个数 :25 宣传 文案获取接 口 public String getadbody() 返回 广告的宣传 文案 需确保有 72 个字符可以被显示 如果 广告区域不不 足以显示 72 个字符, 建议不不要在 广告中添加宣传 文案, 或者使 用滚动 文本效果, 让全部宣传 文案能够被显示
评级获取接 口 public float getadstarrating() 返回该 广告应 用在 Google Play 上的评级 宣传图获取接 口 public String getadcoverimageurl() 返回 广告宣传图的 Url 地址, 当返回值为 NULL 时, 当前 广告数据中不不含宣传图 广告中可以添加宣传图 片, 促进 用户点击 广告的欲望 可以缩放和裁剪宣传图的 一部分, 但请不不要扭曲和改变它 宣传图的 大 小通常是 :796*416 像素 ( 比例例为 1.91:1) DuAdChoicesView 该 View 是 Facebook 原 生 广告返回的 AdChoices 角标 使 用 Facebook 原 生 广告时必须添加的元素, 非 Facebook 原 生 广告不不 用添加 构造 方法 : public DuAdChoicesView(Context mcontext, NativeAd mnativead, boolean isexpand) 参数 Context mcontext NativeAd mnativead boolean isexpand 说明 ACTIVITY CONTEXT 原 生 广告对象控制 AdChoises 角标是否可扩展, 推荐值为 true 10.7 销毁原 生 广告 List 对象 在退出原 生 广告展示界 面时, 建议销毁原 生 广告 List 对象 接 口说明 : public void destroy() Java 代码示例例 :
@Override protected void ondestroy() { super.ondestroy(); adsmanager.setlistener(null); adsmanager.destroy(); Kotlin 代码示例例 : override fun ondestroy() { super.ondestroy() mdunativeadsmanager.apply { setlistener(null) destroy() 11. 常 见问题 11.1 SDK 接 入 Q: 最新版 SDK 接 入 文档下载地址 A:http://ad.duapps.com/zh_CN/sdk/ Q:SDK 下载 页提供基础包和扩展包, 我应该选择哪个? A: 请根据您所需的 广告形式 自由选择, 其中基础包为必选包, 扩展包为可选包 eg1: 我只需要原 生 广告, 请选择基础包 HW 1.x.x; eg2: 我需要原 生 插屏 视频 广告, 请选择基础包 CW 1.x.x+ 扩展包 Video SDK 1.x.x.x; Q:json 可否重复初始化? A: 可以多次初始化, 以最后 一次为准, 请确保最后 一次初始化时, 已传 入全部正确的 pid; 若已接 入视频 SDK, 在初始化 DuVideoSDK.init() 时, 也要保证已传 入全部正确的 pid Q: 返回错误之后是否会 自动重试? A: 不不会 自动重试, 获取 广告失败后请根据错误码再次发起请求, 注意不不要在回调 onerror() 中重试, 否则可能导致死循环 Q: 原 生 广告点击率低 A: 点击属于 用户 行行为, 建议增 大原 生 广告的可点击区域, 并确认已经注册 广告可点击区域视图的监听 ; 同时, 广告位设计的样式也会影响 用户的点击, 如需帮助请携 广告截图联系我们 Q: 原 生 广告怎么没有回调? A: 请确认原 生 广告对象与监听是否 一 一对应, 销毁原 生 广告对象后, 重新构造的 广告对象时, 需要对新的对象注册 广告数据监听 ; 同 一个 广告版位, 不不同的 广告对象, 需要重新注册对应的监听 11.2 平台
Q: 为什什么应 用在平台的状态是 待激活? A: 已经通过平台审核, 可接收测试 广告, 有 广告展示后, 系统会下发正式 广告, 同时状态变为 发布中 Q: 平台数据是实时的吗? A: 不不是, 平台数据有延迟, 当天可查看前 一天的数据, 以北北京时间 0:00-23:59 为 一天计算 Q: 为什什么平台上的数据跟我统计的不不 一样? A: 获取 广告 load() 时, 如果有缓存, 默认不不会再次发起请求, 因此平台上的请求数可能 比您统计到的 load() 次数偏低 ; 不不同平台的统计规则略略有不不同,DAP 的 广告数据请以 DAP 平台的为准 Q: 如何对 广告进 行行过滤? A: 在平台填写 过滤设置, 可选择按照应 用包名 / 广告类别 / 受众年年龄进 行行过滤 11.3 广告 Q: 获取 广告时, 返回错误码 1001 A: 请核对包名 app license 和 pid 三者是否正确匹配, 配置 方法详 见4. 加载与配置 Q: 获取 广告时, 返回错误码 3000 A: 请确认测试机是否已连接全局 vpn, 确认 方法 : 使 用测试设备查询 IP 归属地, 非中国 大陆 IP 可拉取 广告 Q: 广告点击后 无法跳转 A: 请确认 android 设备已安装 Google Play 11.4 其他 Q: 为什什么我的 APP 有展示, 但没有收 入 / 收 入过低? A:DAP 目前是效果类的 广告, 展示后需要 用户有点击 安装 激活等 行行为才会带来收 入 ; 对于新接 入的应 用, 建议提 高dau 加快优化进度 ; 放量量后系统需要 一段时间优化 ; 如对收 入仍有疑问, 请及时联系我们 Q: 是否 支持聚合? A:DAP 作为 mediation 现仅 支持聚合 Admob 和 facebook, 如需更更多的第三 方 广告, 推荐使 用 Admob 作为 mediation, 并在后台勾选 Du Ad Platform