优优SDK接入文档
2025-07-11
版本说明
| 版本 | 更新内容 | 更新时间 |
|---|---|---|
| 1.7.2.1 | 【新增】合规问题整改 必要设备信息用时获取等 | 2025.12.11 |
| 1.7.2.0 | 【新增】合规问题整改 【修复】已知问题修复 | 2025.11.24 |
| 1.7.1.0 | 【新增】广告交互优化 【修复】已知问题修复 | 2025.11.12 |
| 1.6.2.0 | 【新增】广告交互优化 【新增】支持广告平台sigmob 【升级】穿山甲、优量汇、快手、百青藤升级至最新版本 【修复】已知问题修复 | 2025.10.17 |
| 1.5.0.0 | 【新增】插屏支持自渲染 【新增】支持外部获取AdInfo 【优化】微信小程序广告流程 【优化】广告样式优化 【修复】已知问题修复 | 2025.09.22 |
| 1.4.2.0 | 【优化】广告样式优化 【优化】OAID内部获取优化 【修复】已知问题修复 | 2025.09.03 |
| 1.3.2.0 | 【新增】支持横幅广告类型 【新增】信息流模板样式 【新增】支持多种广告平台 【优化】广告流程优化 | 2025.08.28 |
| 1.2.5.1 | 【新增】扭一扭互动方式 【优化】点击以及埋点等功能优化 【修复】已知问题修复 | 2025.08.08 |
| 1.2.0.0 | 【新增】支持广告竞价 【适配】支持YoYo广告联盟 【适配】支持京媒sdk,版本2.6.32 | 2025.07.09 |
| 1.0.2.1 | 【兼容】荣耀设备兼容 【优化】开屏、信息流模板、信息流自渲染优化 【修复】其已知问题优化 | 2025.07.02 |
| 1.0.1.0 | 【优化】视频播放优化 【优化】初始化流程优化 【优化】交互方式优化 【修复】其他已知问题优化 | 2025.06.09 |
| 1.0.0.0 | 【新增】支持开屏广告 【新增】支持激励视频广告 【新增】支持插屏广告 【新增】支持信息流模板渲染 【新增】支持信息流自渲染 | 2025.05.22 |
1 接入准备
1.1 添加SDK
1.1.1 本地依赖方式
将YoYo广告提供的SDK压缩包解压
将libs中所有aar、jar包放入自己项目app模块的libs文件夹下
app模块下build.gradle中配置
android {
//其他配置
defaultConfig {
//其他配置
//配置ndk架构
ndk {
// 指定打包到 APK 的 ABI
abiFilters.addAll(listOf("armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"))
}
}
}
dependencies {
//【必要】添加YoYo广告Sdk,xxxx为版本名称
implementation(files("libs/sdk-ad-multi-xxxx.aar"))
}1.1.2 远程Maven依赖方式
- 项目的build.gradle中添加远程仓库
dependencyResolutionManagement {
repositories {
//yoyoSDK主包
maven {
url = uri("https://packages.aliyun.com/685a1892ea94056d333214d0/maven/yoyo-release")
credentials {
username = "680610124731dac664809f84"
password = "X6fSzdmb4ESQ"
}
}
//广告平台-穿山甲
maven {
url = uri("https://artifact.bytedance.com/repository/pangle")
}
//广告平台-百青藤
mavenCentral()
//广告源平台-京媒
maven {
url = uri("https://jitpack.io")
}
}
}- app的build.gradle中添加远程依赖
方式一:一键接入【推荐】
dependencies {
//【必要】添加YoYo广告Sdk(版本号详见文档顶部说明部分)
implementation("com.yoyo.ad:sdk-ad-all:xxxx")
}方式二:分包接入,【必要】YoYo广告核心库 + 【可选】不同广告平台,详见“7. 第三方广告联盟”
dependencies {
//【必要】添加YoYo广告Sdk核心库(版本号详见文档顶部说明部分)
implementation("com.yoyo.ad:sdk-ad-multi:xxxx")
//【建议】广告平台,详见“7. 第三方广告联盟”
implementation("com.yoyo.ad:multi-adapter-jd:xxxx")
implementation("com.yoyo.ad:multi-adapter-csj:xxxx")
implementation("com.yoyo.ad:multi-adapter-gdt:xxxx")
implementation("com.yoyo.ad:multi-adapter-baidu:xxxx")
implementation("com.yoyo.ad:multi-adapter-ks:xxxx")
implementation("com.yoyo.ad:multi-adapter-sigmob:xxxx")
}1.1.3其他相关SDK说明
dependencies {
//添加OAID_SDK
implementation(files("libs/oaid_sdk_1.0.25.aar"))
//添加微信开放平台SDK
implementation("com.tencent.mm.opensdk:wechat-sdk-android:+")
}1、信通院标识符SDK
为提升广告推荐精准度,建议引入信通院标识符SDK,目前支持1.0.25及以上版本。
历史版本详见 https://www.msa-alliance.cn/col.jsp?id=120
2、微信开放平台SDK
为拓展广告能力,支持微信小程序、微信小游戏类广告,建议引入微信开放平台SDK,目前支持6.8.0及以上版本。
历史版本详见 https://developers.weixin.qq.com/doc/oplatform/Downloads/Android_Resource.html
1.1.4 适配说明
当前SDK版本已经适配支持AndroidX。
当前SDK版本已适配支持Android 13。
当前SDK版本已适配Java 11。
1.2 AndroidManifest.xml文件配置
Androidmanifest中添加权限声明以及其他配置:
<!-- 必要权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 可选权限,建议添加-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission
android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
<uses-permission android:name="com.asus.msa.SupplementaryDID.ACCESS" />
<uses-permission android:name="freemme.permission.msa" />
<!-- 如果接入了视频相关的广告, 请务必添加,否则可能出现视频广告黑屏 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:hardwareAccelerated="true" <!--支持硬件加速,建议-->
android:usesCleartextTraffic="true" <!--允许Http通信,必要-->
>
</application>1.3 代码混淆配置
如果您需要使用proguard混淆代码,需确保不要混淆SDK的代码。
请在混淆文件添加如下配置:
# 保留YoYo包名下所有类不混淆
-keep class com.yoyo.ad.** { *; }若使用资源混淆组件,则需将资源文件添加至白名单:
andResGuard {
whiteList = [
//YoYoAd
"R.drawable.yo_*",
"R.layout.yo_*",
"R.mipmap.yo_*",
"R.id.yo*",
"R.color.yo*",
"R.dimen.yo*",
"R.string.yo*",
"R.style.yo*",
"R.anim.yo_*",
"R.raw.yo_*",
"R.xml.yo_*",
//京媒
"R.drawable.jad*",
"R.layout.jad*",
"R.mipmap.jad*",
"R.id.jad*",
"R.color.jad*",
"R.dimen.jad*",
"R.string.jad*",
"R.style.jad*",
"R.anim.jad*",
"R.raw.jad*",
"R.xml.jad*",
//穿山甲
"R.drawable.tt*",
"R.drawable.live*",
"R.layout.tt*",
"R.layout.live*",
"R.mipmap.tt*",
"R.mipmap.live*",
"R.id.tt*",
"R.id.item_touch_helper*",
"R.color.tt*",
"R.color.ec_store_window_background*",
"R.dimen.tt*",
"R.dimen.fastscroll*",
"R.dimen.item_touch_helper*",
"R.string.tt*",
"R.string.live*",
"R.style.tt*",
"R.style.live*",
"R.style.AlphaAnimation*",
"R.style.AlphaAnimation*",
"R.style.Bullet.Bottom.Dialog.Animation*",
"R.style.Dialog.BottomSheet.Transparent*",
"R.style.EC*",
"R.anim.cj_*",
"R.anim.ec_*",
"R.anim.tt_*",
"R.anim.bullet_bottom_dialog*",
"R.anim.shopping_popup*",
"R.raw.tt*",
"R.raw.live*",
"R.raw.zeus*",
"R.xml.tt*",
//优量汇
"R.integer.min_screen_width_bucket",
"R.style.DialogAnimationUp",
"R.style.DialogAnimationRight",
"R.style.DialogFullScreen",
"R.drawable.gdt_*"
//快手
"R.drawable.ksad_*",
"R.layout.ksad_*",
"R.mipmap.ksad_*",
"R.id.ksad_*",
"R.color.ksad_*",
"R.dimen.ksad_*",
"R.string.ksad_*",
"R.style.ksad_*",
"R.anim.ksad_*",
"R.raw.ksad_*",
"R.xml.ksad_*",
//百青藤
"R.drawable.bd_*",
"R.drawable.ic_*",
"R.layout.baidu_*",
"R.layout.mobads_*",
"R.id.bd_*",
"R.color.bd_*",
"R.dimen.bd_*",
"R.string.bd_*",
"R.style.bd_*",
"R.anim.bd_*",
"R.raw.bd_*",
"R.xml.bd_*",
]
}2 初始化SDK
为避免SDK在用户同意隐私协议与用户协议之前获取用户信息,YoYo广告SDK向开发者提供了初始化方法,开发者可根据App具体情况选择初始化时机,建议Application或首个Activity。
建议开发者在APP首次运行时,通过弹窗等明显方式提示用户阅读《隐私政策》,用户确认同意《隐私政策》后,再调用此接口初始化SDK进行用户信息的收集与处理。
1、YoMoreAd.init:只进行SDK初始化,不会获取用户隐私信息,建议在Application-onCreate中执行
//SDK初始化方法,不会获取设备及用户信息,建议在Application-onCreate中执行
YoMoreAd.init(
//建议传Application类型的Context
context.getApplicationContext(),
//初始化参数设置
YMConfig.newBuilder()
//是否开启debug, 建议false
.setDebug(true)
//YoYo广告平台的唯一应用标识,可通过管理后台获取
.setAppId(appId)
//微信开放平台Id,建议传入。可在SDK后台配置,也可在初始化时设置。
.setWechatAppId(wechatAppId)
//第三方广告联盟的appId,key值为第三方广告联盟在YoYo广告平台的唯一标识,枚举值详见 {@link com.yoyo.ad.core.YMPlatformId}
.addAppId(YMPlatformId.YoYo, yoAppId)
//第三方广告联盟的appKey,若无可不传
.addAppKey(YMPlatformId.YoYo, yoAppKey)
//第三方广告联盟的appSecret,若无可不传
.addAppSecret(YMPlatformId.YoYo, yoAppSecret)
//第三方广告联盟,如京媒sdk
.addAppId(YMPlatformId.JD, jdAppId)
//是否使用聚合功能,建议开启以便提升广告收益,默认true
.setUseMediation(true)
//自定义控制项:可使用YoCustomController全实现,也可使用YoCustomControllerSimple选择实现
.setCustomController(new YoCustomController() {
/**
* 建议传入
*/
@Override
public String getAndroidId() {
//回传AndroidId,建议传入,若为空有可能影响广告填充
return androidId;
}
@Override
public String getOaid() {
//回传oaid,建议传入,若为空有可能影响广告填充
return oaid;
}
@Override
public String getDevImei() {
//回传imei,建议传入,若为空有可能影响广告填充
return imei;
}
@Override
public YoLocationProvider getLocation() {
//回传经纬度
return new YoLocationProvider() {
@Override
public double getLatitude() {
//自实现获取纬度
return getLatitudeCustom();
}
@Override
public double getLongitude() {
//自实现获取经度
return getLongitudeCustom();
}
};
}
@Override
public boolean isCanPersonalRecommend() {
//是否允许个性化广告推荐,默认允许。建议开启
return true;
}
@Override
public boolean isSupportMultiProcess() {
//是否支持多进程,默认false
return false;
}
@Override
public boolean isSupportAdvanceInteraction() {
//是否支持高级互动,true则表示允许传感器采集数据,用于摇一摇、扭一扭等,false标识不允许,若不设置则默认true
return true;
}
@Override
public String getDevImsi() {
//回传imsi
return imsi;
}
@Override
public String getMacAddress() {
//回传mac地址
return macAddress;
}
/**
* 以下可选传
*/
@Override
public boolean isCanUsePhoneState() {
//是否允许获取设备信息如imei等,默认允许
return true;
}
@Override
public boolean isCanUseAndroidId() {
//是否允许读取AndroidId,默认允许。若不允许也可在getAndroidId方法主动回传
return true;
}
@Override
public boolean isCanUseWifiState() {
//是否允许获取网络信息(mac、ip等),默认允许
return true;
}
@Override
public boolean isCanUseAppList() {
//是否允许读取安装应用列表,默认允许
return true;
}
@Override
public boolean isCanUseLocation() {
//是否允许获取位置信息,默认允许。若不允许也可在getLocation方法中主动回传
return true;
}
})
.build(),
new YMInitCallback() {
@Override
public void onFailure(int code, String msg) {
Log.i(TAG, "初始化失败:code=" + code + ", msg=" + msg);
}
@Override
public void onSuccess() {
Log.i(TAG, "初始化成功");
//调用start方法:该方法中会获取设备及用户信息,建议在隐私协议之后调用
YoMoreAd.start(null);
}
}
);YoMoreAd.start:启动SDK,建议在同意隐私协议后,YoMoreAd.init初始化成功后调用。
//SDK启动方法,建议在同意隐私协议后,YoMoreAd.init初始化成功后调用。
//YMStartCallback启动回调:若不关心回调,则可传null
YoMoreAd.start(startCallback);3. 接入广告类型
每个广告对象仅允许加载、展示一次,且加载展示的顺序不能出错,如果使用出错不会有任何提示,请检查自己的使用是否有误。
3.1 开屏广告
开屏广告以App启动作为曝光时机,提供3~5s的可感知广告展示。用户可以点击广告跳转按钮跳转到目标页面;或者点击右上角的“跳过”按钮,跳转到app内容首页。
适用场景:开屏广告会在您的应用开启时加载,拥有固定展示时间(一般为3~5秒),展示完毕后自动关闭并进入您的应用主界面。
接入示例:
//广告加载
YoMoreAd.loadSplashAd(
//建议使用Activity类型Context
context,
//广告加载参数
AdParams.newBuilder()
.setAdId("$adCode") //【必要】代码位,可在管理后台申请
.setAcceptedWidth($width) //期望宽度,单位px,用于图片类素材
.setAcceptedHeight($height) //期望高度,单位px,用于图片类素材
.setExtra("$extra") //额外参数,json字符串格式
.build(),
//广告加载结果回调
new SplashLoadListener() {
@Override
public void onFail(int code, String msg) {
//广告加载失败回调
}
@Override
public void onLoaded(List<SplashAd> adList) {
//广告加载成功回调
if (adList != null && adList.size() > 0) {
splashAd = adList.get(0);
}
if (splashAd != null) {
//获取广告价格,单位:分
int price = splashAd.getPrice();
//广告价格是否是真实价:true=真实价,false=预估价
boolean isRealPrice = splashAd.isRealPrice();
}
}
@Override
public void onAdReady(SplashAd splashAd) {
//【可选】素材预准备完成
}
@Override
public void onAdPrepareFail(SplashAd splashAd, int code, String msg) {
//【可选】素材预准备失败
}
});
//广告展示
//【重要】必须调用 isCanShow() 检测广告是否可展示,否则有可能因广告过期或重复展示等原因导致展示失败或无效展示
if (splashAd != null && splashAd.isCanShow()) {
//设置广告交互监听:可使用SplashInteractionListener全实现,也可使用SplashInteractionListenerSimple选择实现
splashAd.setInteractionListener(new SplashInteractionListenerSimple() {
@Override
public void onAdShowed() {
//广告展示成功回调
}
@Override
public void onAdShowFail(int code, String msg) {
//广告展示失败回调
}
@Override
public void onAdClicked() {
//广告点击回调
}
@Override
public void onAdClosed() {
//广告关闭回调,在此跳转主页
}
@Override
public void onTimeOver() {
//广告倒计时结束回调
}
@Override
public void onVideoStart() {
//视频播放开始
}
@Override
public void onVideoSkipped() {
//视频跳过
}
@Override
public void onVideoComplete() {
//视频结束
}
@Override
public void onVideoError(int code, String msg) {
//视频错误
}
});
//广告View获取
View adView = splashAd.getAdView(activity, adContainer);
//广告View添加到广告容器
adContainer.addView(adView);
} else {
Toast.makeText(context, "请先加载广告", Toast.LENGTH_SHORT).show();
}
/**
* 【必要】生命周期相关方法,必须调用,避免内存泄漏等
*/
@Override
protected void onResume() {
super.onResume();
if (splashAd != null) {
splashAd.resume();
}
}
@Override
protected void onPause() {
super.onPause();
if (splashAd != null) {
splashAd.pause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (splashAd != null) {
splashAd.destroy();
}
}3.2 激励视频广告
激励视频广告是指广告短视频融入到app场景当中,用户观看激励视频广告满足条件后可以得到一定的奖励。
适用场景:激励视频广告是一种常见的视频类的广告样式,多出现在游戏的复活、应用增值服务等位置。
接入示例:
//广告加载
YoMoreAd.loadRewardVideoAd(
//建议使用Activity类型Context
context,
//广告加载参数
AdParams.newBuilder()
.setAdId("$adCode") //【必要】代码位,可在管理后台申请
.setExtra("$extra") //额外参数,json字符串格式
.build(),
//广告加载结果回调
new RewardLoadListener() {
@Override
public void onFail(int code, String msg) {
//广告加载失败回调
}
@Override
public void onLoaded(List<RewardVideoAd> adList) {
//广告加载成功回调
if (adList != null && adList.size() > 0) {
rewardVideoAd = adList.get(0);
}
if (rewardVideoAd != null) {
//获取广告价格,单位:分
int price = rewardVideoAd.getPrice();
//广告价格是否是真实价:true=真实价,false=预估价
boolean isRealPrice = rewardVideoAd.isRealPrice();
}
}
@Override
public void onAdReady(RewardVideoAd rewardVideoAd) {
//【可选】素材预准备完成
}
@Override
public void onAdPrepareFail(RewardVideoAd rewardVideoAd, int code, String msg) {
//【可选】素材预准备失败
}
});
//广告展示
//【重要】必须调用 isCanShow() 检测广告是否可展示,否则有可能因广告过期或重复展示等原因导致展示失败或无效展示
if (rewardVideoAd != null && rewardVideoAd.isCanShow()) {
//设置广告交互监听:可使用RewardInteractionListener全实现,也可使用RewardInteractionListenerSimple选择实现
rewardVideoAd.setInteractionListener(new RewardInteractionListener() {
@Override
public void onAdShowed() {
//广告展示成功回调
}
@Override
public void onAdShowFail(int code, String msg) {
//广告展示失败回调
}
@Override
public void onAdClicked() {
//广告点击回调
}
@Override
public void onAdClosed() {
//广告关闭回调
}
@Override
public void onRewardVerify(boolean isRewardValid, Bundle extraInfo) {
//激励回调
}
@Override
public void onVideoStart() {
//视频播放开始
}
@Override
public void onVideoSkipped() {
//视频跳过
}
@Override
public void onVideoComplete() {
//视频结束
}
@Override
public void onVideoError(int code, String msg) {
//视频错误
}
});
//广告展示, context为Activity示例,必要
rewardVideoAd.show(activity);
} else {
Toast.makeText(activity, "请先加载广告", Toast.LENGTH_SHORT).show();
}3.3 插屏广告
插屏广告是移动广告的一种常见形式,广告素材类型比较丰富,包括视频类、图文类,广告呈现方式也比较灵活,可在管理后台配置,选择使用半屏或全屏呈现。
适用场景:应用的大部分流程。
接入示例:
//广告加载
YoMoreAd.loadInterstitialAd(
//建议使用Activity类型Context
context,
//广告加载参数
AdParams.newBuilder()
.setAdId("$adCode") //【必要】代码位,可在管理后台申请
.setExtra("$extra") //额外参数,json字符串格式
.build(),
//广告加载结果回调
new InterstitialLoadListener() {
@Override
public void onFail(int code, String msg) {
//广告加载失败回调
}
@Override
public void onLoaded(List<InterstitialAd> adList) {
//广告加载成功回调
if (adList != null && adList.size() > 0) {
interstitialAd = adList.get(0);
}
if (interstitialAd != null) {
//获取广告价格,单位:分
int price = interstitialAd.getPrice();
//广告价格是否是真实价:true=真实价,false=预估价
boolean isRealPrice = interstitialAd.isRealPrice();
}
}
@Override
public void onAdReady(InterstitialAd interstitialAd) {
//【可选】素材预准备完成
}
@Override
public void onAdPrepareFail(InterstitialAd interstitialAd, int code, String msg) {
//【可选】素材预准备失败
}
});
//广告展示
//【重要】必须调用 isCanShow() 检测广告是否可展示,否则有可能因广告过期或重复展示等原因导致展示失败或无效展示
if (interstitialAd != null && interstitialAd.isCanShow()) {
//设置广告交互监听:可使用InterstitialInteractionListener全实现,也可使用InterstitialInteractionListenerSimple选择实现
interstitialAd.setInteractionListener(new InterstitialInteractionListenerSimple() {
@Override
public void onAdShowed() {
//广告展示成功回调
}
@Override
public void onAdShowFail(int code, String msg) {
//广告展示失败回调
}
@Override
public void onAdClicked() {
//广告点击回调
}
@Override
public void onAdClosed() {
//广告关闭回调
}
@Override
public void onVideoStart() {
//视频播放开始
}
@Override
public void onVideoSkipped() {
//视频跳过
}
@Override
public void onVideoComplete() {
//视频结束
}
@Override
public void onVideoError(int code, String msg) {
//视频错误
}
});
//广告展示, context为Activity示例,必要
interstitialAd.show(activity);
} else {
Toast.makeText(activity, "请先加载广告", Toast.LENGTH_SHORT).show();
}3.4 信息流模板渲染广告
由广告联盟SDK提供渲染模板,开发者可在广告联盟管理后台配置渲染样式,包括上图下文、上文下图、大图等。
适用场景:适用于动态信息流等广告场景。
接入示例:
//广告加载
YoMoreAd.loadFeedAd(
//建议使用Activity类型Context
context,
//广告加载参数
AdParams.newBuilder()
.setAdId("$adCode") //【必要】代码位,可在管理后台申请
.setAcceptedWidth($width) //期望宽度,单位px,用于图片类素材
.setAcceptedHeight($height) //期望高度,单位px,用于图片类素材
.setExtra("$extra") //额外参数,json字符串格式
.build(),
//广告加载结果回调
new FeedLoadListener() {
@Override
public void onFail(int code, String msg) {
//广告加载失败回调
}
@Override
public void onLoaded(List<FeedAd> adList) {
//广告加载成功回调
if (adList != null && adList.size() > 0) {
feedAd = adList.get(0);
}
if (feedAd != null) {
//获取广告价格,单位:分
int price = feedAd.getPrice();
//广告价格是否是真实价:true=真实价,false=预估价
boolean isRealPrice = feedAd.isRealPrice();
}
}
@Override
public void onAdReady(FeedAd feedAd) {
//【可选】素材预准备完成
}
@Override
public void onAdPrepareFail(FeedAd feedAd, int code, String msg) {
//【可选】素材预准备失败
}
});
//广告展示
//【重要】建议调用 isCanShow() 检测广告是否可展示,否则有可能因广告过期或重复展示等原因导致展示失败或无效展示
if (feedAd != null && feedAd.isCanShow()) {
//设置广告交互监听:可使用FeedInteractionListener全实现,也可使用FeedInteractionListenerSimple选择实现
feedAd.setInteractionListener(new FeedInteractionListener() {
@Override
public void onAdShowed() {
//广告展示成功回调
}
@Override
public void onAdShowFail(int code, String msg) {
//广告展示失败回调
}
@Override
public void onAdClicked() {
//广告点击回调
}
@Override
public void onAdClosed() {
//广告关闭回调,在此移除广告视图等
//为避免页面闪屏,SDK在触发关闭时不会主动移除视图
}
@Override
public void onVideoStart() {
//视频播放开始
}
@Override
public void onVideoSkipped() {
//视频跳过
}
@Override
public void onVideoComplete() {
//视频结束
}
@Override
public void onVideoError(int code, String msg) {
//视频错误
}
});
//广告View获取
View adView = feedAd.getAdView(activity, adContainer);
//广告View添加到广告容器
adContainer.addView(adView);
} else {
Toast.makeText(context, "请先加载广告", Toast.LENGTH_SHORT).show();
}
/**
* 【必要】生命周期相关方法,必须调用,避免内存泄漏等
*/
@Override
protected void onResume() {
super.onResume();
if (feedAd != null) {
feedAd.resume();
}
}
@Override
protected void onPause() {
super.onPause();
if (feedAd != null) {
feedAd.pause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (feedAd != null) {
feedAd.destroy();
}
}3.5 自渲染广告
由广告联盟SDK提供渲染数据,开发者自定义渲染样式。
适用场景:适用于动态信息流等广告场景。
接入示例:
//广告加载参数
AdParams adParams = AdParams.newBuilder()
.setAdId("$adCode") //【必要】代码位,可在管理后台申请
.setAcceptedWidth($width) //期望宽度,单位px,用于图片类素材
.setAcceptedHeight($height) //期望高度,单位px,用于图片类素材
.setExtra("$extra") //额外参数,json字符串格式
.build();
//广告加载结果回调
NativeLoadListener nativeLoadListener = new NativeLoadListener() {
@Override
public void onFail(int code, String msg) {
//广告加载失败回调
}
@Override
public void onLoaded(List<NativeAd> adList) {
//广告加载成功回调
if (adList != null && adList.size() > 0) {
nativeAd = adList.get(0);
}
if (nativeAd != null) {
//获取广告价格,单位:分
int price = nativeAd.getPrice();
//广告价格是否是真实价:true=真实价,false=预估价
boolean isRealPrice = nativeAd.isRealPrice();
}
}
@Override
public void onAdReady(NativeAd nativeAd) {
//【可选】素材预准备完成
}
@Override
public void onAdPrepareFail(NativeAd nativeAd, int code, String msg) {
//【可选】素材预准备失败
}
};
//广告加载-信息流自渲染
YoMoreAd.loadFeedNativeAd(
//建议使用Activity类型Context
context,
//广告加载参数
adParams,
//广告加载结果回调
nativeLoadListener
);
//广告加载-插屏自渲染
YoMoreAd.loadInterstitialNativeAd(
//建议使用Activity类型Context
context,
//广告加载参数
adParams,
//广告加载结果回调
nativeLoadListener
);
//广告展示
//【重要】建议调用 isCanShow() 检测广告是否可展示,否则有可能因广告过期或重复展示等原因导致展示失败或无效展示
if (nativeAd != null && nativeAd.isCanShow()) {
//设置广告交互监听:可使用NativeInteractionListener全实现,也可使用NativeInteractionListenerSimple选择实现
nativeAd.setInteractionListener(new NativeInteractionListener() {
@Override
public void onAdShowed() {
//广告展示成功回调
}
@Override
public void onAdShowFail(int code, String msg) {
//广告展示失败回调
}
@Override
public void onAdClicked() {
//广告点击回调
}
@Override
public void onAdClosed() {
//广告关闭回调,在此进行其他操作
//为避免页面闪屏,SDK在触发关闭时不会主动移除视图
}
@Override
public void onVideoStart() {
//视频播放开始
}
@Override
public void onVideoSkipped() {
//视频跳过
}
@Override
public void onVideoComplete() {
//视频结束
}
@Override
public void onVideoError(int code, String msg) {
//视频错误
}
});
//广告扩展View获取(一般为视频或图片View)
View advanceView = nativeAd.getAdvanceView(activity, advanceContainer)
advanceContainer.addView(advanceView);
//广告素材自渲染
titleText.setText(nativeAd.getTitle());
summaryText.setText(nativeAd.getDescription());
submitBtn.setText(nativeAd.getButtonText());
adIcon.setImageResource(nativeAd.getAdLogoResource());
closeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
nativeAd.destroy();
}
});
//注册交互View
//可使用 NativeViewProvider 实现所有方法,也可使用 NativeViewProviderSimple 选择实现部分方法
nativeAd.registerViewForInteraction(feedNativeView, new NativeViewProvider() {
@Override
public List<View> getClickViewList() {
//可点击的View列表
//扩展advanceView是否若需要支持点击,则加入点击列表
return Arrays.asList(summaryText, advanceView);
}
@Override
public List<View> getCreativeViewList() {
//触发创意交互的View列表
return Arrays.asList(titleText, summaryText, advanceContainer);
}
@Override
public List<View> getCloseViewList() {
//可关闭的View列表
return Arrays.asList(closeView);
}
@Override
public List<View> getDownloadViewList() {
//触发下载的View列表
return Arrays.asList(downloadView);
}
});
} else {
Toast.makeText(activity, "请先加载广告", Toast.LENGTH_SHORT).show();
}
/**
* 【必要】生命周期相关方法,必须调用,避免内存泄漏等
*/
@Override
protected void onResume() {
super.onResume();
if (nativeAd != null) {
nativeAd.resume();
}
}
@Override
protected void onPause() {
super.onPause();
if (nativeAd != null) {
nativeAd.pause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (nativeAd != null) {
nativeAd.destroy();
}
}信息流自渲染API说明
/**
* 广告Icon资源
*
* @return int
*/
int getAdLogoResource();
/**
* 标题
*
* @return String
*/
String getTitle();
/**
* 描述
*
* @return String
*/
String getDescription();
/**
* 按钮文案
*
* @return String
*/
String getButtonText();
/**
* 来源(DSP名称) ,文字
*
* @return String
*/
String getSource();
/**
* 产品Icon Url
*
* @return String
*/
String getProductIconUrl();
/**
* 产品版本名称
*
* @return String
*/
String getProductName();
/**
* 单图类广告
*
* @return List<String>
*/
String getImageUrl();
/**
* 图片列表,多图类广告
*
* @return List<String>
*/
List<String> getImageUrlList();
/**
* 获取视频Url
*
* @return String
*/
String getVideoUrl();
/**
* 获取视频时长,单位ms
*
* @return long
*/
long getVideoDuration();
/**
* 广告样式,枚举值详见{@link com.yoyo.ad.core.AdStyle}
*
* @return int
*/
int getAdStyle();
/**
* 交互类型,枚举值详见{@link com.yoyo.ad.core.InteractionStyle}
*
* @return int
*/
int getInteractionType();
/**
* 扩展View
* 已封装的视频播放View、单图View
*
* @param context Activity类型的Context
* @param containerView 扩展View容器
* @return View
*/
public View getAdvanceView(Context context, ViewGroup containerView);
/**
* 额外信息
*
* @return Map<String, Object>
*/
Map<String, Object> getMediaExtraInfo();
/**
* 交互View设置
*
* @param viewGroup 根视图
* @param NativeViewProvider 交互视图(详见下面说明) {@link com.yoyo.ad.core.scene.NativeViewProvider}
*/
void registerViewForInteraction(ViewGroup viewGroup, NativeViewProvider viewProvider);
/**
* 产品版本号
*
* @return int
*/
int getProductVersionCode();
/**
* 产品版本名称
*
* @return String
*/
String getProductVersionName();
/**
* 开发者
*
* @return String
*/
String getProductDeveloper();
/**
* 隐私协议URL
*
* @return String
*/
String getProductPrivacyUrl();
/**
* 隐私协议URL
*
* @return String
*/
String getProductPermissionUrl();
/**
* 隐私协议文本
*
* @return String
*/
String getProductPrivacyText();
/**
* 权限说明URL
*
* @return String
*/
String getProductPermissionUrl();
/**
* 权限文本
*
* @return String
*/
String getProductPermissionText();
/**
* 功能说明URL
*/
String getProductFunctionUrl();
/**
* 功能文本
*/
String getProductFunctionText();
/**
* 备案信息Url
*/
String getProductIcpUrl();
/**
* 备案信息文本
*/
String getProductIcpText();
/**
* 数字值 , 单位为Byte
*/
long getProductFileSize();NativeViewProvider 说明,也可使用 NativeViewProviderSimple 选择实现以下方法
public interface NativeViewProvider {
/**
* 可点击的View列表
*/
List<View> getClickViewList();
/**
* 可触发交互的View列表
*/
List<View> getCreativeViewList();
/**
* 可触发下载的View列表
*/
List<View> getDownloadViewList();
/**
* 可触发关闭的View列表
*/
List<View> getCloseViewList();
}交互样式枚举值详见 com.yoyo.ad.core.InteractionStyle,具体如下:
/**
* 交互类型:未知
*/
public final static int INTERACTION_UNKNOWN = -1;
/**
* 交互类型:正常
*/
public final static int INTERACTION_NORMAL = 0;
/**
* 交互类型:摇一摇
*/
public final static int INTERACTION_SHAKE = 1;
/**
* 交互类型:扭一扭
*/
public final static int INTERACTION_ROTATE = 2;4. 实时竞价
支持的广告类型:所有广告类型。
相关方法说明:
/**
* 获取价格
*
* @return 当前广告价格,单位分
*/
int getPrice();
/**
* 竟胜回传
*
* @param platform 对方平台名称 {@link com.yoyo.ad.core.AdPlatform}
* @param price 对方出价,单位分
*/
void bidWin(String platform, int price);
/**
* 竟败回传
*
* @param lossCode 竟败原因 {@link com.yoyo.ad.core.LossReason}
* @param platform 对方平台名称,如csj、BaiDu
* @param price 对方出价,单位分
*/
void bidLoss(int lossCode, String platform, int price);
/**
* 广告价格是否是真实价:一般展示前获取到的是预估价格,展示后获取的是真实价格
*
* @return true=真实价,false=预估价
*/
boolean isRealPrice();竞价平台枚举值详见 com.yoyo.ad.core.AdPlatform,具体如下:
/**
* 优优
*/
public final static String YoYo = "YoYo";
/**
* 穿山甲
*/
public final static String CSJ = "csj";
/**
* 广点通 或 优量汇
*/
public final static String GDT = "gdt";
/**
* 快手
*/
public final static String KuaiShou = "KuaiShou";
/**
* 百度 或 百青藤
*/
public final static String BaiDu = "Baidu";
/**
* VIVO
*/
public final static String VIVO = "vivo";
/**
* OPPO
*/
public final static String OPPO = "oppo";
/**
* 小米
*/
public final static String XiaoMi = "XiaoMi";
/**
* 华为
*/
public final static String HuaWei = "HuaWei";
/**
* 京东
*/
public final static String JingDong = "JingDong";
/**
* SIGMOB
*/
public final static String SIGMOB = "Sigmob";
/**
* 爱奇艺
*/
public final static String IQIYI = "IQiYi";
/**
* 阿里妈妈
*/
public final static String ALIMAMA = "AliMama";
/**
* 其他
*/
public final static String OTHER = "other";竟败回传原因枚举值详见 com.yoyo.ad.core.LossReason,具体如下:
/**
* 竞争力不足,如不是本次竞价的最高出价方,可上报此竞败原因
*/
public final static int LOSS_CODE_LOW_PRICE = 1;
/**
* 无广告回包,如优在本次竞价中未返回广告,可上报此竞败原因
*/
public final static int LOSS_CODE_NO_AD = 2;
/**
* 有广告回包但是未参与竞价
*/
public final static int LOSS_CODE_NO_JOIN = 101;
/**
* 其他(有回包)
*/
public final static int LOSS_CODE_OTHER = 10001;5. 其他API
5.1 com.yoyo.ad.core.YoMoreAd
/**
* 获取SDK版本号
*
* @return int
*/
public static int getSdkVersionCode();
/**
* 获取SDK版本名称
*
* @return String
*/
public static String getSdkVersionName();5.1 com.yoyo.ad.core.scene.AdInfo
支持媒体获取AdInfo信息,媒体可将RequestId加入埋点,便于核对排查明细数据。
已开屏为例:
if (splashAd != null) {
AdInfo adInfo = splashAd.getAdInfo();
if (adInfo != null) {
String requestId = adInfo.getRequestId();
}
}AdInfo支持的API如下
/**
* 广告位信息
*/
String getAdId();
/**
* 广告位级别的RequestId
*/
String getRequestId();
/**
* 广告价格,单位分
*/
int getPrice();
/**
* 广告平台Id
*/
long getPlatformId();6. 错误码
若出现的错误码在找不到,可联系我方。
| 错误码(code) | 错误说明(msg) |
|---|---|
| 10700 | 正在初始化,无需重复初始化 |
| 10701 | 初始化上下文Context不能为空 |
| 10702 | 初始化参数AppId不能为空 |
| 10704 | 初始化失败 |
| 10800 | 初始化SDK失败 |
| 10801 | 代码位不能为空 |
| 10802 | 初始化未成功,请检查先调用YoMoreAd.init进行初始化 |
| 10812 | 请求参数不完整 |
| 10821 | 广告配置参数错误 |
| 10823 | 广告配置不可用 |
| 10824 | 广告加载参数错误 |
| 10825 | 广告加载重复 |
| 10826 | 广告配置异常 |
| 10827 | 未加载到广告 |
| 10828 | 广告组重复加载 |
| 10829 | 广告配置异常 |
| 10830 | 广告重复加载 |
| 10831 | 广告配置异常 |
| 10832 | 广告源不存在或初始化异常 |
| 10833 | 广告加载超时 |
| 10834 | 很抱歉,暂不支持该广告类型 |
| 10835 | 未加载到广告 |
| 10836 | 广告组未加载到广告 |
| 10851 | 广告构建失败 |
| 10852 | 无可用广告 |
| 10861 | 广告重复展示 |
7. 第三方广告联盟
7.1 京媒
| 适配器版本 | 第三方sdk版本 | 更新内容 | 更新时间 |
|---|---|---|---|
| 1.7.0.0 | 2.6.32 | 1、已知问题修复 | 2025.11.07 |
| 1.6.1.0 | 2.6.32 | 1、广告展示优化 | 2025.10.17 |
| 1.5.0.0 | 2.6.32 | 1、广告流程优化 | 2025.09.22 |
| 1.3.0.0 | 2.6.32 | 1、京媒适配器优化 | 2025.08.28 |
| 1.2.0.0 | 2.6.32 | 1、接入京媒开屏、插屏、信息流、信息流自渲染 2、支持广告加载、竞价、展示 | 2025.07.09 |
- 添加依赖
a. maven依赖
添加仓库
allprojects {
repositories {
maven {
url "https://jitpack.io"
}
}
}添加依赖
dependencies {
//京媒适配器 -远程依赖
implementation("com.yoyo.ad:multi-adapter-jd:xxxx")
}b、本地依赖
dependencies {
//1、京媒适配器 -本地依赖
implementation(files("libs/sdk_yoyo_ad_multi_adapter_jd.aar"))
//2、方式1:添加京媒sdk -本地依赖
implementation(files("libs/jad_yun_sdk_xxx.aar"))
//2、方式2:添加京媒sdk -远程依赖
implementation("com.github.JAD-FE-TEAM.JADYunAndroid:jad_yun_sdk:xxx")
}- 注意事项
a、若使用资源混淆组件,则需将资源文件添加至白名单:
andResGuard {
whiteList = [
//京媒
"R.drawable.jad*",
"R.layout.jad*",
"R.mipmap.jad*",
"R.id.jad*",
"R.color.jad*",
"R.dimen.jad*",
"R.string.jad*",
"R.style.jad*",
"R.anim.jad*",
"R.raw.jad*",
"R.xml.jad*",
]
}7.2 穿山甲
| 适配器版本 | 第三方sdk版本 | 更新内容 | 更新时间 |
|---|---|---|---|
| 1.7.0.0 | 7.1.3.2 | 1、已知问题修复 | 2025.11.07 |
| 1.6.1.0 | 7.1.3.2 | 1、版本升级 2、广告加载展示优化 | 2025.10.17 |
| 1.5.0.0 | 7.0.2.9 | 1、广告流程优化 | 2025.09.22 |
| 1.3.0.0 | 7.0.2.9 | 1、支持穿山甲广告 | 2025.08.28 |
- maven依赖
添加仓库
allprojects {
repositories {
maven {
url "https://artifact.bytedance.com/repository/pangle"
}
}
}添加依赖
dependencies {
//适配器 -远程依赖
implementation("com.yoyo.ad:multi-adapter-csj:xxxx")
}- 注意事项
a、穿山甲68版本起要求minSdkVersion为24,即兼容的最小手机系统版本为7.0;
//【不建议】可通过一下方式覆盖minSdkVersion设置,但不建议,以免有兼容性问题
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="34"
tools:overrideLibrary="com.bytedance.sdk.openadsdk,com.bytedance.gromore" />b、若使用资源混淆组件,则需将资源文件添加至白名单:
andResGuard {
whiteList = [
//穿山甲
"R.drawable.tt*",
"R.drawable.live*",
"R.layout.tt*",
"R.layout.live*",
"R.mipmap.tt*",
"R.mipmap.live*",
"R.id.tt*",
"R.id.item_touch_helper*",
"R.color.tt*",
"R.color.ec_store_window_background*",
"R.dimen.tt*",
"R.dimen.fastscroll*",
"R.dimen.item_touch_helper*",
"R.string.tt*",
"R.string.live*",
"R.style.tt*",
"R.style.live*",
"R.style.AlphaAnimation*",
"R.style.AlphaAnimation*",
"R.style.Bullet.Bottom.Dialog.Animation*",
"R.style.Dialog.BottomSheet.Transparent*",
"R.style.EC*",
"R.anim.cj_*",
"R.anim.ec_*",
"R.anim.tt_*",
"R.anim.bullet_bottom_dialog*",
"R.anim.shopping_popup*",
"R.raw.tt*",
"R.raw.live*",
"R.raw.zeus*",
"R.xml.tt*",
]
}7.3 优量汇
| 适配器版本 | 第三方sdk版本 | 更新内容 | 更新时间 |
|---|---|---|---|
| 1.7.0.0 | 4.660.1530 | 1、已知问题修复 | 2025.11.07 |
| 1.6.1.0 | 4.660.1530 | 1、版本升级 2、广告加载展示优化 | 2025.10.17 |
| 1.5.0.0 | 4.650.1520 | 1、广告流程优化 | 2025.09.22 |
| 1.3.0.0 | 4.650.1520 | 1、支持优量汇广告 | 2025.08.28 |
- maven依赖
添加依赖
dependencies {
//适配器 -远程依赖
implementation("com.yoyo.ad:multi-adapter-gdt:xxxx")
}- 注意事项
a、插屏必须设置 AdParams.newBuilder().setAdStyle(),取值为:AdStyle.INTERSTITIAL_FULL全屏、AdStyle.INTERSTITIAL_HALF半屏;
b、开屏:点击跳转即回调onAdClose
c、若使用了资源混淆插件AndResGuard,为了保证SDK的资源可以被正常使用,需要在build.gradle中新增白名单配置,内容如下: 若使用资源混淆组件,则需将资源文件添加至白名单:
andResGuard {
whiteList = [
//优量汇
"R.integer.min_screen_width_bucket",
"R.style.DialogAnimationUp",
"R.style.DialogAnimationRight",
"R.style.DialogFullScreen",
"R.drawable.gdt_*"
]
}7.4 百青藤
| 适配器版本 | 第三方sdk版本 | 更新内容 | 更新时间 |
|---|---|---|---|
| 1.7.0.0 | 9.420 | 1、已知问题修复 | 2025.11.07 |
| 1.6.1.0 | 9.420 | 1、版本升级 2、广告加载展示优化 | 2025.10.17 |
| 1.5.0.0 | 9.391.2 | 1、广告流程优化 | 2025.09.22 |
| 1.3.0.0 | 9.391.2 | 1、支持百青藤广告 | 2025.08.28 |
- maven依赖
添加仓库
allprojects {
repositories {
mavenCentral()
}
}添加依赖
dependencies {
//适配器 -远程依赖
implementation("com.yoyo.ad:multi-adapter-baidu:xxxx")
}- 注意事项
a、若使用资源混淆组件,则需将资源文件添加至白名单:
andResGuard {
whiteList = [
//百青藤
"R.drawable.bd_*",
"R.drawable.ic_*",
"R.layout.baidu_*",
"R.layout.mobads_*",
"R.id.bd_*",
"R.color.bd_*",
"R.dimen.bd_*",
"R.string.bd_*",
"R.style.bd_*",
"R.anim.bd_*",
"R.raw.bd_*",
"R.xml.bd_*",
]
}7.5 快手
| 适配器版本 | 第三方sdk版本 | 更新内容 | 更新时间 |
|---|---|---|---|
| 1.7.0.0 | 4.9.20.1 | 1、已知问题修复 | 2025.11.07 |
| 1.6.1.0 | 4.9.20.1 | 1、版本升级 2、广告加载展示优化 | 2025.10.17 |
| 1.5.0.0 | 4.6.30.1 | 1、广告流程优化 | 2025.09.22 |
| 1.3.0.0 | 4.6.30.1 | 1、支持快手广告 | 2025.08.28 |
- maven依赖
添加依赖
dependencies {
//适配器 -远程依赖
implementation("com.yoyo.ad:multi-adapter-ks:xxxx")
}- 注意事项
a、若使用了资源混淆插件AndResGuard,为了保证SDK的资源可以被正常使用,需要在build.gradle中新增白名单配置,内容如下: 若使用资源混淆组件,则需将资源文件添加至白名单:
andResGuard {
whiteList = [
//快手
"R.drawable.ksad_*",
"R.layout.ksad_*",
"R.mipmap.ksad_*",
"R.id.ksad_*",
"R.color.ksad_*",
"R.dimen.ksad_*",
"R.string.ksad_*",
"R.style.ksad_*",
"R.anim.ksad_*",
"R.raw.ksad_*",
"R.xml.ksad_*",
]
}7.6 Sigmob
| 适配器版本 | 第三方sdk版本 | 更新内容 | 更新时间 |
|---|---|---|---|
| 1.7.0.0 | 4.24.6 | 1、已知问题修复 | 2025.11.07 |
| 1.6.1.0 | 4.24.6 | 1、新增适配 2、广告加载展示优化 | 2025.10.17 |
- maven依赖
添加依赖
dependencies {
//适配器 -远程依赖
implementation("com.yoyo.ad:multi-adapter-sigmob:xxxx")
}- 注意事项
a、若使用了资源混淆插件AndResGuard,为了保证SDK的资源可以被正常使用,需要在build.gradle中新增白名单配置,内容如下: 若使用资源混淆组件,则需将资源文件添加至白名单:
andResGuard {
whiteList = [
//sigmob
"R.string.sig_*",
"R.integer.sig_*",
"R.layout.sig_*",
"R.drawable.sig_*",
"R.style.sig_*",
"R.dimen.sig_*",
"R.anim.sig_*",
"R.color.sig_*",
"R.id.sig_*"
"R.attr.sig_*"
]
}