广告SDK接入说明文档

1. SDK简介

1.1  广告类型

提供6种广告:横幅广告、视频广告、开屏广告、插屏广告、模板插屏广告、原生广告

注:具体广告效果参照广告sdk的Demo程序运行效果。

1.2 广告SDK版本升级

针对广告SDK版本升级,参照以下步骤:

1. 从官网下载最新版本(https://www.yousuode.cn/download/sdk) 解压获取aar包(在 ngad-sdk-all-*.zip\04-依赖库\aar接入方式\ngad-sdk-release-*.aar 里),对比版本号,如果已经是最新版本则无需替换;如果不是最新版本则需要替换更新aar包

2. Android Studio工程,比较简单。删除本地工程的旧版aar包,替换最新版本

3. Eclipse 工程,解压aar包分别拷贝到旧版内容的目录包括:assets、res、libs、libs/armeabi,覆盖替换相关的文件,

注意:旧版本sdk的多余资源文件需要删除。

1.3. ChangeLog

版本号接入变更
v2.2.901、添加检测工具(05-检测工具)
v2.2.601、新增了原生广告接口
v2.2.501、AndroidManifest.xml的权限和组件声明
2、Proguard文件
3、libs目录引用的AAR或JAR文件版本号及数量
4、res目录文件
5、新增targetVersion>=24时,FileProvider路径配置
v2.2.301、AndroidManifest.xml的权限和组件声明
2、Proguard文件
3、libs目录引用的AAR或JAR文件版本号及数量
4、res目录文件
5、添加广告加载异常处理说明:单次启动应用,如果连续5次加载广告失败,不再发起请求。

2. SDK嵌入

2.1 步骤1:添加SDK到工程中

解压开ngad-sdk-all-*.zip文件,在04-依赖库目录下可以看到NGASDK提供的两种接入方式的依赖库。

libs-dependency

【Android Studio工程引入】(推荐)

  1. 把“aar接入方式”目录下的libs目录内容拷贝到游戏的Android项目工程对应的libs目录中
  2. 阅读libs目录下的ReadMe.txt内容,检查是否依赖库,删除冲突的依赖库
  3. 添加Gradle脚本
 
  1. 废弃资源删除
    a) 检查libs目录或jni目录,删除旧版在libs目录中提供的 libffmpeg.so、 libinitHelper.so、 libng_util.so、 librotate.so、 libu3player.so、 libun7z.so
  2. 解决冲突

libs-for-gradle

红框部分为可能冲突部分。

  1. 解决alisdk-utdid-20160516.jar的冲突
    a) 如果检查libs目录下存在和utdid相关的包名,则不需要添加alisdk-utdid-20160516.jar
    b) 如果编译期出现UTDID相关类名冲突,则不需要添加alisdk-utdid-20160516.jar
  2. 解决gamesdk-framework-shellbase-*.aar的冲突
    a)如果已经集成了阿里游戏的游戏SDK7.x版本,则不需要添加gamesdk-framework-shellbase-*.aar; b)如果已经集成阿里游戏的游戏SDK8.x版本,则降级为7.x版本,目前广告SDK不支持与8.x版本的游戏SDK同时集成;
    c)如果编译期出现UCGameSdk相关类名冲,则不需要添加gamesdk-framework-shellbase-*.aar
  3. 其他冲突解决方案就联系技术支撑人员

【Eclipse工程引入】(不推荐)

  1. 把“jar接入方式”目录下的libs、assets、res目录内容拷贝到游戏的Android项目工程中对应的libs、assets、res目录中
  2. 引入android-support-v4.jar (可以从网上获取,若已存在则忽略)
  3. 废弃资源删除
    a) 检查libs目录或jni目录,删除旧版在libs目录中提供的 libffmpeg.so、 libinitHelper.so、 libng_util.so、 librotate.so、 libu3player.so、 libun7z.so
  4. 解决冲突

libs-for-eclipse

红框部分为可能冲突部分。

  1. 解决alisdk-utdid-20160516.jar的冲突
    a) 如果检查libs目录下存在和utdid相关的包名,则不需要添加alisdk-utdid-20160516.jar
    b) 如果编译期出现UTDID相关类名冲突,则不需要添加alisdk-utdid-20160516.jar
  2. 解决gamesdk-framework-shellbase-*.aar的冲突
    a)如果已经集成了阿里游戏的游戏SDK7.x版本,则不需要添加gamesdk-framework-shellbase-*.jar、广告SDK提供的assets/ucgamesdk目录下的so资源;
    b)如果已经集成阿里游戏的游戏SDK8.x版本,则降级为7.x版本,目前广告SDK不支持与8.x版本的游戏SDK同时集成;
    c)如果编译期出现UCGameSdk相关类名冲,则不需要添加gamesdk-framework-shellbase-*.jar
  3. 通常通过jar包方式接入的厂商,经常会漏添加或更新res、assets目录下的资源、混淆规则,所以在尽可能保持
  4. 其他冲突解决方案就联系技术支撑人员

2.2 步骤2:修改AndroidManifest.xml文件

 添加权限声明:

 

如果您打包App时的targetSdkVersion >= 23:请在先获取到SDK要求的所有权限,然后再调用SDK的广告接口。否则SDK将无法工作,我们建议您在App启动时就去获取SDK需要的权限,Demo工程中也提供了基本的权限处理示例代码供开发者参考。

如果您打包App时的targetSdkVersion >= 24:除了需要处理好权限申请以外,还需要处理好文件访问的兼容性。

添加SDK组件声明

 

注意:这里的 ${applicationId} 不是广告的appId,而是Android工程(接入游戏包名)applicationId,比如 com.brianbaek.popstar

在项目结构下的res目录下添加一个xml文件夹,拷贝adp_file_path.xml文件到xml文件夹中,文件内容如下:

 

2.3 步骤3:使用检测工具验证是否存在接入问题

  1. 解压checktool.zip到任意目录下
  2. 在该目录下,mac和linux系统运行 start.sh,Windows运行 start.bat
  3. 按步骤执行,根据检测结果修正接入问题 sdk-check-select sdk-check-result

3. 接入代码

3.1 初始化SDK

在LauncherActivity/WelcomeActivity/SplashActivity 中进行SDK的初始化

NGASDK初始化是使用SDK所提供功能可以执行的前提,否则会导致广告加载失败。游戏在应用启动时LauncherActivity的onCreate方法中插入广告SDK初始化逻辑。

 

 

NGASDK主要API

public class NGASDKFactory

限定符和类型方法和说明
static NGASDKgetNGASDK()

public interface NGASDK

限定符和类型方法和说明
<T extends NGAProperties>loadAd()
加载广告请求
注意:为了提高广告的填充率以及曝光量,建议重新加载广告时候重新调用此方法,重新请求新的广告内容。

3.2 横幅广告

 

注:更多详细代码示例,请参考Demo工程代码:cn.sirius.adsdkdemo.BannerActivity

注意:设置的广告回调对象应该是成员对象,不应该是new 的临时对象。因为广告sdk内部对回调对象做了一次软引用WeakReference包装,临时对象没有被其他逻辑引用可能会回收释放,最终会导致调用方收不到回调事件。

public class NGABannerProperties extends NGAProperties<NGABannerController,NGABannerListener>

限定符和类型方法和说明
NGABannerListenergetListener()
获取广告的监听(回调)对象
voidsetListener()
设置广告的监听(回调)对象,设置时机是在发起广告请求之前。

public abstract class NGAProperties

限定符和类型方法和说明
ActivitygetActivity()
返回广告显示的Activity对象
java.lang.StringgetAppId()
返回App ID
ViewGroupgetContainer()
返回广告显示的容器
java.lang.ObjectgetExtraData()
返回扩展属性(内部属性)
abstract ListenergetListener()
获取广告的监听(回调)对象
java.lang.StringgetPositionId()
返回广告位ID
voidsetExtraData(java.lang.Object data)
设置扩展属性(内部属性)
abstract voidsetListener
设置广告的监听(回调)对象,设置时机是在发起广告请求之前。

public interface NGABannerListener extends NGAdListener

public interface NGAdListener

限定符和类型方法和说明
voidonClickAd()
点击广告
voidonCloseAd()
关闭广告
voidonErrorAd(int code, java.lang.String message)
广告过程发生错误
<T extends NGAdController>onReady(T controller)
广告已准备好,通知广告逻辑生成并获取得到控制对象
voidonRequestAd()
通知广告请求
voidonShowAd()
显示广告

public interface NGABannerController extends NGAdController

public interface NGAdController

限定符和类型方法和说明
voidcloseAd()
关闭广告
voidshowAd()
显示广告

3.3 插屏广告

 

注:更多详细代码示例,请参考Demo工程代码:cn.sirius.adsdkdemo.InsertActivity

public class NGAInsertProperties extends NGAProperties>

限定符和类型方法和说明
NGAInsertListenergetListener()
获取广告的监听(回调)对象
voidsetListener (NGAInsertListener listener)
设置广告的监听(回调)对象,设置时机是在发起广告请求之前。

public interface NGAInsertListener extends NGAdListener

public interface NGAInsertController extends NGAdController

限定符和类型方法和说明
voidcancelAd()
取消广告请求

3.4 视频广告

 

注:更多详细代码示例,请参考Demo工程代码:cn.sirius.adsdkdemo.VideoActivity

限定符和类型方法和说明
NGAVideoListenergetListener()
获取广告的监听(回调)对象
voidsetListener (NGAVideoListener listener)
设置广告的监听(回调)对象,设置时机是在发起广告请求之前。

public interface NGAVideoListener extends NGAdListener

限定符和类型方法和说明
voidonCompletedAd()
视频广告播放完成

public interface NGAVideoController extends NGAdController

限定符和类型方法和说明
voiddestroyAd()
销毁广告
booleanhasCacheAd()
查询是否有缓存广告

注意: loadAd加载视频广告,如果有    onReady 回调,表明有新广告返回,调用showAd播放新的视频广告,而不是缓存的广告,
如果没有 onReady 回调,接入逻辑使用旧的mController 对象调用showAd 就会播放缓存的广告。

3.5 开屏广告

通常开屏广告会前嵌入在LauncherActivity/WelcomeActivity/SplashActivity里面,们在“NGASDK初始化”的success回调中插入请求加载开屏逻辑

 

注:更多详细代码示例,请参考Demo工程代码: cn.sirius.adsdkdemo.WelcomeActivity

 

限定符和类型方法和说明
NGAWelcomeListenergetListener()
获取广告的监听(回调)对象
ViewgetSkipView()
获取自定义的跳过按钮
voidsetListener (NGAWelcomeListener listener)
设置广告的监听(回调)对象,设置时机是在发起广告请求之前。
voidsetSkipView(View skipView)
可以通过传入传入skipContainer参数,支持开发者自定义的跳过按钮。

public interface NGAWelcomeListener extends NGAdListener

限定符和类型方法和说明
voidonTimeTickAd(long millisUntilFinished)
倒计时回调,返回广告还将被展示的剩余时间。

public interface NGAWelcomeController extends NGAdController

3.6 模板插屏广告

模板插屏广告与插屏广告有展示方式类似,再普通插屏广告的基础上,提供了UI的模板,具有一定的自定义属性,使得模板插屏有更好的融入性,同时也能提升广告收益

 

注:更多详细代码示例,请参考Demo工程代码: cn.sirius.adsdkdemo.TemplateActivity

public class NGAGeneralProperties extends NGAProperties<NGAGeneralController, NGAGeneralListener>

限定符和类型方法和说明
NGAGeneralListenergetListener()
获取广告的监听(回调)对象
voidsetListener(NGAGeneralListener listener)
设置广告的监听(回调)对象,设置时机是在发起广告请求之前。

public interface NGAGeneralListener extends NGAdListener

public interface NGAWelcomeController extends NGAdController

模板传入参数详细
在请求到广告,获得controller后,可以调用showAd(Map<String,String> param)方法来传入自定义参数,来调整模板的样式,具体参数描述如下:

参数key参数意义参数格式使用示例备注使用范围
bgRes弹窗背景图资源StringmShowParam.put("bgRes", "drawable/bg");获取drawable文件夹下的资源,支持drawable、mipmap1号模板、2号模板
dialogText弹窗游戏文案StringmShowParam.put("dialogText", "点击领取");直接传入文字内容传参2号模板
dialogTextColor弹窗游戏文案颜色StringmShowParam.put("dialogTextColor", "#edeef2");使用色码来表示颜色,需要“#”开头2号模板
btnText操作按钮文案StringmShowParam.put("btnText", "点击领取");直接传入文字内容传参2号模板
btnTextColor操作按钮文案颜色StringmShowParam.put("btnTextColor", "#36561f");使用色码来表示颜色,需要“#”开头2号模板
btnRes操作按钮图资源StringmShowParam.put("btnRes", "drawable/button_bg");获取drawable文件夹下的资源,支持drawable、mipmap,支持png、xml格式2号模板
front字体文件StringmShowParam.put("btnRes", "assets/heiti.ttf");获取assets文件夹下的资源,获得字体资源文件2号模板

showAd(Map<String,String> param)可以重复调用,动态改变弹窗样式,但曝光仅计算一次

如果上述参数不填写,则由sdk补充默认参数

模板事件回调id

当模板上触发特殊事件时,sdk会回调onEvent(NGAdEvent event),接入方可根据event.eventId判断回调事件类型,具体参数如下:

eventId参数意义
1操作按钮被点击(首次)
2操作按钮被点击(第二次或者以上)

3.7 原生广告

原生广告提供了高度自定义的广告类型,使得广告能与app高度融合,给开发者提供了高自由度的开发接口

 

注:更多详细代码示例,请参考Demo工程代码: cn.sirius.adsdkdemo.NativeAdActivity

public class NGANativeProperties extends NGAProperties<NGANativeController,NGANativeListener>

限定符和类型方法和说明
NGANativeListenergetListener()
获取广告的监听(回调)对象
voidsetListener(NGANativeListener listener)
设置广告的监听(回调)对象,设置时机是在发起广告请求之前。

public interface NGANativeListener extends NGAdListener

public interface NGANativeController extends NGAdController

限定符和类型方法和说明
List<NGANativeAdData>getAdList()
获取广告对象列表
voidcloseAd()标记广告关闭,务必调用,否则影响计量

public interface NGANativeAdData

限定符和类型方法和说明
StringgetTitle();
获得广告标题文字
StringgetDesc();
获得广告详细描述文字
StringgetIconUrl();
获得广告图标url
ListgetImgList();
获得广告图片url集合
doublegetRating();
获得广告评分
booleanisApp();
广告是否app类型
StringgetButtonText();
广告按钮文案
StringgetAdLogo();
获得广告logo图标url,根据相关规定,请将该logo放在广告右下角
voidexposure(View container);
标记广告曝光,并启动监听点击功能,曝光后务必调用,否则影响计量

4. Android 6.0以上版本添加运行时权限

4.1 接入说明

google对于Android 6.0以上的版本,要求添加运行时权限,否则SDK可能由于无权限而导致播放视频失败。

建议在第三方apk初始化时主动请求获取这些权限,权限请求越早越好。

4.2 接入示例

如第三方接入已经有运行时权限检查的功能,请将1.2步骤AndroidManifest.xml中SDK运行需要的权限自行添加。

如第三方接入未添加运行时权限检查功能,根据实际业务情况,参考如下步骤添加,兼容Android 6.0以上的版本。

4.2.1 Acitivity中加入代码

 

4.2.2 在MainActivity(或应用的主Activity类型) #onCreate 函数增加权限判断,如下:

 

5. 兼容性

 

需要注意的是provider的authorities值为{applicationId}在代码中和Context.getPackageName()值相等,是应用的唯一id。例如demo示例工程中的applicationId为"com.qq.e.union.demo"。

(2)在项目结构下的res目录下添加一个xml文件夹,再新建一个adp_file_path.xml的文件,文件内容如下:

 

6. 注意事项

代码混淆

 如果您的发布包(release包)需要使用proguard混淆代码,需确保不要混淆SDK的代码。请在proguard.cfg文件(或其他混淆文件)尾部添加如下配置:

 

错误码

错误码错误描述
10001,ON_ERROR_AD_CODE_INIT_SDK_FAILED"Init SDK Failed", 初始化sdk失败
10002, ON_ERROR_AD_CODE_RECEIVE_AD_FAILED"Receive Ad Failed",广告显示失败
10003, ON_ERROR_AD_CODE_LOAD_AD_FAILED"Load Ad Failed",加载广告失败
"load ad over time",加载广告超时
10004, ON_ERROR_AD_CODE_PARAMETER_ERROR"parameter error",参数错误,请检查!
10005,ON_ERROR_AD_CODE_LOAD_TOO_FREQUENTLY"load too frequently",请求广告过于频繁,请稍后再试
13001, ON_ERROR_AD_CODE_VIDEO_NO_DATA"No Video Ad Data",没有视频广告
13002, ON_ERROR_AD_CODE_VIDEO_NO_WIFI"No WIFI, Video Ad Error",非WiFi网络播放视频失败
3XX初始化错误
403HHTP状态码错误:建议检查网络状态
404网络超时:建议检查网络状态
405加载资源出错:建议网络状态
406图片加载出错:建议检查网络状态
4XX网络错误
500广告位错误:建议检查广告位是否正确
501无广告返回:建议重新请求广告
5XX广告错误
600广告容器不可见错误:建议检查代码逻辑,保证广告容器可见
601网络类型错误。例:开屏广告仅在wifi下展示
602Android权限错误:建议检查AndroidManifest是否声明了所需权限
606开屏广告高度不足400dp:建议检查layout布局中传给开屏广告的容器高度
607原生广告未先调用曝光接口,就调用了点击接口
608开屏广告自定义跳过按钮不符合要求,例如尺寸小于3x3dp,或者在屏幕中不可见
6XX其他错误
700视频素材下载错误
701视频素材播放错误
109506广告请求频次过高

常见问题FAQ

问题:广告无法加载出来的场景问题

原因分析,可能有以下情况导致

  1. 没有调用sdk初始化:init ,建议在Application OnCreate做广告sdk初始化;

  2. Eclipse工程引入sdk情况下,缺失jar、so文件;

  3. Eclipse工程引入sdk情况下,没有引入support包;

  4. 网络不通(有WiFi但无法联网),导致广告请求连接失败;
    或者:

    • App安装后首次启动初始化逻辑比较多网络请求比较多,导致广告请求连接超时失败;
    • 这种情况下,建议延迟广告请求(如延迟2s后),这样不影响你们其他正常业务的网络请求,同时也保证尽量让每次广告请求都成功。
  5. release包混淆配置没有添加广告sdk过滤配置,参考接入说明文档。

问题:设置了广告回调 (NGAdListener子类对象),但是没有收到回调通知。

原因分析:设置的广告回调对象是new 的临时对象,不是成员对象,没有被其他逻辑引用可能会回收释放,

因为广告sdk内部对回调对象做了一次软引用WeakReference包装。

问题:获取到广告控制器(NGAdController对象)之后,能不能重复调用展示/关闭广告操作(showAd/closeAd)?

答:横幅、普通插屏、开屏、视频广告不可以, 调用closeAd关闭广告之后,再调用showAd,很可能无法正常显示广告。只有模板广告允许多次调用,以供微调自定义界面。
重新加载广告需要重新调用NGASDK#loadAd方法,等待onReadyAd事件回调获取广告控制器重新加载新的广告(showAd),此操作同时提高广告的填充率以及曝光量。

问题:如何处理广告加载失败情况?

答:根据具体错误码处理。特别地,单次启动应用,如果连续5次加载广告失败,切莫再发起请求。