# Android SDK 集成说明
# SDK嵌入
- 申请应用的APP ID和广告位ID
请联系相应的商务人员申请账户和相关 ID
如有其他问题,欢迎联系
- 导入AAR包
将 Android SDK 包复制到您工程的 libs 目录下,并按如下步骤将其导入:
- SDK AAR 包下载和获取
- 打开 Android 项目工程目录
- 拷贝 mhsdk-2.54.aar,广点通SDK,穿山甲SDK,WSDK,OWSDK,BXMSDK,快手SDK,优量宝SDK 至 libs 目录下,并作项目依赖
以上 SDK 联系商务沟通,选择接入,具体可见火眼平台-接入中心 (opens new window)
- 配置 AndroidManifest.xml
权限申请
权限申请示例
<!-- 必须接入,影响广告投放以及收益--> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <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_EXTERNAL_STORAGE" />
接入检查
此步骤用于您进行接入的自我检查,检查 SDK AAR 文件中的配置和资源是否正确应用到您的项目中。
如果您打包 App 时的 targetSdkVersion >= 24,请添加 provider 申明(如下),否则不需要添加。
其中 mh_file_path.xml 文件在 SDK res/xml 目录下。
provider申明示例
<!-- targetSDKVersion >= 24 时才需要添加这个 provider --> <!-- provider 的 authorities 属性的值为 ${applicationId}.fileprovider,请开发者根据自己的 ${applicationId} 来设置这个值 --> <provider <!--androidx为对应路径下的provider--> android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/mh_file_path" /> </provider> <!—穿山甲需要接入 --> <provider android:name="com.bytedance.sdk.openadsdk.TTFileProvider" android:authorities="${applicationId}.TTFileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/mh_file_path" /> </provider> <!—穿山甲需要接入 --> <provider android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider" android:authorities="${applicationId}.TTMultiProvider" android:exported="false" /> <!—wsdk需要接入 --> <provider android:name="com.sigmob.sdk.SigmobFileProvider" android:authorities="${applicationId}.sigprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/sigmob_provider_paths" /> </provider> <!-- one way --> <provider android:name="mobi.oneway.export.OWProvider" android:authorities="${applicationId}.OWProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/mh_file_path" /> </provider> <!-- 优量宝--> <provider android:name="com.wannuosili.sdk.ad.component.WNFileProvider" android:authorities="${applicationId}.WNFileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/mh_file_path" /> </provider>
注意
接入 变现猫SDK , minSdkVersion 必须为 21 以上
# 接入代码示例
聚合SDK支持 横幅广告、插屏广告、开屏广告、原生自渲染广告、原生模板广告、激励视频 等广告形式。
详细嵌入步骤如下:
注意事项
为了适配穿山甲SDK 建议在进程周期 onCreate 初始化SDK
MhAdManagerHolder.init(this, MediaId);
/*初始化接口时新增了是否需要保护隐私的参数*/
/*true: 需要保护隐私(即不读取位置接口)*/
/*false: 不需要保护隐私*/
MhAdManagerHolder.init(this, MediaId, false);
对于 Android 10 及以上版本需要传入OAID
DeviceUtil.setOaid(OAID);
建议开发者优先集成OAID
Android 10 无法通过常规方式获取IMEI(不传会影响广告测试及正式广告的填充)
示例中所有的 adId 需要替换成本平台真实的广告位id
# Banner
示例
final BannerAd bannerView = new BannerAd(BannerActivity.this, new BannerAdListener() {
@Override
public void onAdReady() {
Log.d(TAG, "onAdReady: ");
}
@Override
public void onAdShow() {
Log.d(TAG, "onAdShow: ");
}
@Override
public void onAdClick() {
Log.d(TAG, "onAdClick: ");
}
@Override
public void onAdFailed(String data) {
Log.d(TAG, "onAdFailed: ");
}
@Override
public void onAdClose() {
Log.d(TAG, "onAdClose: ");
}
@Override
public void onAdFinish() {
Log.d(TAG, "onAdFinish ");
}
});
container.addView(bannerView);
bannerView.loadBanner(adId);
//在 onDestroy 周期执行 bannerAd.destroy();
@Override
protected void onDestroy() {
super.onDestroy();
if (bannerAd != null)
bannerAd.destroy();
}
API名称 | 功能 |
---|---|
loadBanner | 加载广告 |
setRefreshTime(t) | 单位秒 设置轮播时长,默认不轮播 |
setAdSize(w,h) | 单位 dp 设置宽高 |
onAdReady | 广告返回成功 |
onAdShow | 广告展示成功 |
onAdClick | 广告点击回调 |
onAdFailed | 广告请求失败 |
onAdClose | 广告关闭回调 |
onAdFinish | 广告展示完成 |
destroy | 释放广告资源 |
# 开屏
示例
SplashAd mhSplashAd = new SplashAd(SplashActivity.this, adId, new SplashAdListener() {
@Override
public void onAdReady() {
Log.d(TAG, "onAdReady: ");
}
@Override
public void onAdShow() {
Log.d(TAG, "onAdShow: ");
}
@Override
public void onAdClick() {
Log.d(TAG, "onAdClick: ");
}
@Override
public void onAdFailed(String data) {
Log.d(TAG, "onAdFailed: ");
}
@Override
public void onAdClose() {
Log.d(TAG, "onAdClose: ");
}
@Override
public void onAdExposure() {
Log.d(TAG, "onAdExposure: ");
}
});
mhSplashAd.loadInitial(viewgroup);
API名称 | 功能 |
---|---|
loadSplash() | 加载广告 |
showSplash(group) | 展示广告 |
onAdReady | 广告返回成功 |
onAdShow | 广告展示成功 |
onAdClick | 广告点击回调 |
onAdFailed | 广告请求失败 |
onAdClose | 广告关闭回调 |
onAdFinish | 广告展示完成 |
onAdExposure | 广告展示一定时长的曝光 |
# 原生自渲染
示例
nativeAd = new NativeAd(NativeAdActivity.this, new NativeAdListener() {
@Override
public void onNativeReady(List<NativeAdInfo> list) {
NativeAdActivity.this.nativeAdInfoList = nativeAdInfoList;
}
@Override
public void onAdFailed(String s) {
Log.d(TAG, "onAdFailed: ");
}
@Override
public void onAdClick() {
Log.d(TAG, "onAdClick: ");
}
@Override
public void onAdClose() {
Log.d(TAG, "onAdClose: ");
}
@Override
public void onAdShow() {
Log.d(TAG, "onAdShow: ");
}
});
nativeAd.loadNative(adId);
API名称 | 功能 |
---|---|
onNativeReady | 广告返回回调List<NativeAdInfo> |
onAdFailed | 广告失败回调 |
onAdClick | 广告点击回调 |
onAdClose | 广告关闭回调 |
onAdFinish | 广告结束回调 |
onAdShow | 广告展示回调 |
NativeAd 相关API
API名称 | 功能 |
---|---|
loadNative | 加载广告 |
setExpectNum | 获取多条广告,默认返回一条 |
registerNative(NativeContainer, clickableViews, nativeAdInfo) | 注册 View 参数一: NativeContainer容器 参数二: 点击 view 参数三: 对应广告实体 |
registerMediaView(MediaView, nativeAdInfo, NativeMediaListener) | 若为视频广告,需要注册视频组件 |
NativeAdInfo 相关API
API名称 | 功能 |
---|---|
getTitle | 广告标题 |
getDescription | 广告描述 |
getImgUrlList | 广告图片 |
isVideo | 是否为视频广告 |
preloadVideo | 若视频,可提前加载 |
getVideo | 获得广告组件,若无返回,则需MediaView来渲染(详见demo) |
resume | 恢复广告,需要在 Activity onResume 周期调用 |
destroy | 销毁广告 需在 Activity onDestroy 周期调用 |
注意事项
广告超时
- 广告从拉取到曝光超过 30 分钟,将作为无效曝光
- 广告从拉取到点击超过 60 分钟,将作为无效点击,不会进行计费
包含关系
- 每一个广告数据对应一个 NativeAdContainer
- 广告展示元素(图片,视频,按钮)必须在 NativeAdContainer 之中,如果不在则会造成点击曝光等事件失效
原生素材的广告只能曝光一次
对于原生广告形式,需要进行把 view 注册进 SDK,否则影响广告数据和收益
参数说明
com.myhayo.dsp.view.NativeContainer:SDK 提供容器组件,需要在 layout 文件中添加
# 原生模板
示例
nativeExpressAd = new NativeExpressAd(NativeExpressActivity.this, adId, new NativeExpressListener() {
@Override
public void onRenderSuccess(DspNativeExpressAdView NativeExpressAdView) {
Log.d(TAG, "onRenderSuccess");
}
@Override
public void onRenderFail(DspNativeExpressAdView dspNativeExpressAdView) {
Log.d(TAG, "onRenderFail");
}
@Override
public void onAdFailed(String s) {
Log.d(TAG, "onAdFailed: " + s);
Message message = Message.obtain();
message.obj = s;
message.what = 0;
handler.sendMessage(message);
}
@Override
public void onAdViewClick(DspNativeExpressAdView NativeExpressAdView) {
Log.d(TAG, "onAdClick: ");
}
@Override
public void onAdViewShow(DspNativeExpressAdView dspNativeExpressAdView) {
Log.d(TAG, "onAdViewShow");
}
@Override
public void onAdViewClose(DspNativeExpressAdView dspNativeExpressAdView){
Log.d(TAG, "onAdViewClose");
}
@Override
public void onAdViewLoaded(List<DspNativeExpressAdView> list) {
Log.d(TAG, "onAdViewLoaded list size " + list.size());
for (int i = 0; i < list.size(); i++) {
list.get(i).preloadVideo();
}
nativeExpressAdViewList = list;
handler.sendEmptyMessage(11);
}
});
nativeExpressAd.setAdMaxNm(1);
nativeExpressAd.loadAd();
API名称 | 功能 |
---|---|
onRenderSuccess | 渲染成功 |
onRenderFail | 渲染失败 |
onAdFailed | 请求广告失败 |
onAdViewClick | 广告点击回调 |
onAdViewShow | 广告展现 |
onAdViewClose | 广告关闭 |
onAdViewLoaded | 广告加载成功返回 List<DspNativeExpressAdView> |
NativeExpressAd 接口
API名称 | 功能 |
---|---|
loadAd | 加载广告 |
setAdMaxNm | 请求期望数广告,默认一条 |
DspNativeExpressAdView 接口
API名称 | 功能 |
---|---|
destroy | 销毁广告 在 activity onDestroy 周期调用 |
render | 渲染广告 |
setWidth | 设置模板的宽 |
setHeight | 设置模板的高度 |
注意事项
- 原生模板广告需要被加载到 AdViewContainer 容器中
# 激励视频
示例
构造函数一:
RewardVideoAd(Activity context, String sid, String userId, String extraInfo, RewardAdListener rewardAdListener);
构造函数二:
RewardVideoAd(Activity context, String sid, RewardAdListener rewardAdListener);
rewardVideoView = new RewardVideoAd(RewardActivity.this, adId, new RewardAdListener() {
@Override
public void onAdVideoComplete() {
Log.d(TAG, "onAdVideoComplete: ");
}
@Override
public void onVideoCached() {
Log.d(TAG, "onVideoCached: ");
}
@Override
public void onAdReady() {
Log.d(TAG, "onAdReady: ");
}
@Override
public void onAdFailed(String s) {
Log.d(TAG, "onAdFailed: " + s);
}
@Override
public void onAdClick() {
Log.d(TAG, "onAdClick: ");
}
@Override
public void onAdClose() {
Log.d(TAG, "onAdClose: ");
}
@Override
public void onAdFinish() {
Log.d(TAG, "onAdFinish: ");
}
@Override
public void onAdShow() {
Log.d(TAG, "onAdShow: ");
}
@Override
public void onReward(boolean b) {
Log.d(TAG, "onRewardVerify: ");
}
});
rewardVideoView.showRewardVideo();
API名称 | 功能 |
---|---|
showRewardVideo | 展示广告,需要在主线程调用! |
userId | 用户ID,服务端奖励参数 |
extraInfo | 用户服务端奖励参数 |
onAdVideoComplete | 视频播放完成 |
onVideoCached | 视频缓存完成 |
onAdReady | 广告请求成功 |
onAdFailed | 广告请求失败 |
onAdClick | 广告点击回调 |
onAdClose | 广告关闭回调 |
onAdFinish | 广告结束回调 |
onAdShow | 广告展示成功回调 |
onReward | 奖励发放回调,参数为 true 时,为服务端奖励 |
destroy | 释放广告资源 |
# 插屏
示例
iad = new InterstitialAd(this, posId, new InterstitialListener() {
@Override
public void onAdReady() {
}
@Override
public void onAdFailed(String s) {
}
@Override
public void onAdClick() {
}
@Override
public void onAdClose() {
}
@Override
public void onAdFinish() {
}
@Override
public void onAdShow() {
}
});
API名称 | 功能 |
---|---|
loadAd | 加载广告 |
showAD | 展示广告 |
destroy | 销毁广告 |
onAdReady | 广告准备成功 |
onAdFailed | 广告请求失败回调 |
onAdClick | 广告点击回调 |
onAdClose | 广告关闭回调 |
onAdFinish | 广告结束回调 |
onAdShow | 广告展示成功 |
注意事项
- 插屏广告同一条广告不能重复曝光(一次 load 只能 show 一次)
- 插屏展示调用( showAD )必须在 ui 线程内调用
- 插屏给开发者的回调( InterstitialListener )全部执行在主线程中(异步回调)
- 尽量复用广告实例,不要实例化过多的广告实例,当广告实例不再使用时务必调用 destory 方法进行资源释放
# 全屏视频
示例
FullScreenVideoAd fullScreenVideoAd = new FullScreenVideoAd(FullVideoActivity.this, new FullVideoAdListener() {
@Override
public void onVideoCached() {
}
@Override
public void onAdFailed(String s) {
}
@Override
public void onAdClick() {
}
@Override
public void onAdClose() {
}
@Override
public void onAdFinish() {
}
@Override
public void onAdShow() {
}
@Override
public void onAdReady() {
}
});
fullScreenVideoAd.loadFullScreenVideoAD(adId);
API名称 | 功能 |
---|---|
loadFullScreenVideoAD | 加载全屏视频 |
showFullScreenVideoAD | 展示全屏视频 |
setFullMediaListener | 设置视频监听 |
onVideoCached | 视频缓存成功 |
onAdFailed | 广告请求失败 |
onAdClick | 广告点击 |
onAdClose | 广告关闭 |
onAdFinish | 广告播放结束 |
onAdShow | 广告展示 |
onAdReady | 广告返回成功 |
# 场景横幅
示例
sceneBannerView = new SceneBannerView(this, container, new BannerAdListener() {
@Override
public void onAdReady() {
Log.d(TAG, "onAdReady");
}
@Override
public void onAdClick() {
Log.d(TAG, "onAdClick");
}
@Override
public void onAdClose() {
Log.d(TAG, "onAdClose");
}
@Override
public void onAdFinish() {
Log.d(TAG, "onAdFinish");
}
@Override
public void onAdShow() {
Log.d(TAG, "onAdShow");
}
@Override
public void onAdFailed(String s) {
Log.d(TAG, "onAdFailed " + s);
}
});
sceneBannerView.loadSceneBanner(AdConst.SceneBanner);
API名称 | 功能 |
---|---|
loadSceneBanner | 加载广告 |
destroy | 销毁广告 |
# 场景浮标
示例
SceneFloatView sceneFloatView = new SceneFloatView(this, container, new ADspListener() {
@Override
public void onAdReady() {
Log.d(TAG, "onAdReady");
}
@Override
public void onAdClick() {
Log.d(TAG, "onAdClick");
}
@Override
public void onAdClose() {
Log.d(TAG, "onAdClose");
}
@Override
public void onAdFinish() {
Log.d(TAG, "onAdFinish");
}
@Override
public void onAdShow() {
Log.d(TAG, "onAdShow");
}
@Override
public void onAdFailed(String s) {
Log.d(TAG, "onAdFailed " + s);
}
});
sceneFloatView.loadSceneFloat(AdConst.SceneFloat);
API名称 | 功能 |
---|---|
loadSceneFloat | 加载广告 |
# 场景按钮
示例
SceneButtonView sceneButtonView = new SceneButtonView(this, container, new ADspListener() {
@Override
public void onAdReady() {
Log.d(TAG, "onAdReady");
}
@Override
public void onAdClick() {
Log.d(TAG, "onAdClick");
}
@Override
public void onAdClose() {
Log.d(TAG, "onAdClose");
}
@Override
public void onAdFinish() {
Log.d(TAG, "onAdFinish");
}
@Override
public void onAdShow() {
Log.d(TAG, "onAdShow");
}
@Override
public void onAdFailed(String s) {
Log.d(TAG, "onAdFailed " + s);
}
});
sceneButtonView.loadSceneButton(AdConst.SceneButton);
API名称 | 功能 |
---|---|
loadSceneButton | 加载广告 |
# Draw信息流
示例
//第二个参数为在我们后台申请广告位ID,第三个参数为请求返回draw模板的个数,需要传入
DrawVideoAd drawVideoAd=new DrawVideoAd(DrawVideoActivity.this, AdConst.DrawAd, 3, new DrawAdListener() {
@Override
public void onError(int i, String s) {
Log.d(TAG, "onAdFailed: "+s);
}
@Override
public void onLoad(List<DrawAd> list) {
Log.d(TAG, "onLoad: ");
for(final DrawAd drawAd:list){
drawLists.add(new DrawAdInfo(null,drawAd));
Log.d(TAG, String.valueOf(drawLists.size()));
drawAd.setDrawAdListener(new DrawVideoAdListener() {
@Override
public void onAdVideoComplete() {
Log.d(TAG, "onAdVideoComplete: ");
}
@Override
public void onVideoPlayPause() {
Log.d(TAG, "onVideoPlayPause: ");
}
@Override
public void onVideoPlayResume() {
Log.d(TAG, "onVideoPlayResume: ");
}
@Override
public void onAdClick() {
Log.d(TAG, "onAdClick: ");
}
@Override
public void onAdClose() {
Log.d(TAG, "onAdClose: ");
}
@Override
public void onAdFinish() {
Log.d(TAG, "onAdFinish: ");
}
@Override
public void onAdShow() {
Log.d(TAG, "onAdShow: ");
}
@Override
public void onAdReady() {
Log.d(TAG, "onAdReady: ");
}
@Override
public void onAdFailed(String s) {
Log.d(TAG, "onAdFailed: "+s);
}
});
}
mRecyclerAdapter.notifyDataSetChanged();
}
});
API名称 | 功能 |
---|---|
destroy | 销毁广告 |
onLoad | 加载广告成功,获取 List<DrawAd> |
onError | 加载发生错误 |
# 更新记录
# 2021-08-10 版本号: 2.54
- 火眼SDK更新至 2.4, 适配开屏新样式相关逻辑
# 2021-08-05 版本号: 2.53
- 广点通SDK更新至 unionNormal.4.380.1250 ,适配相关逻辑
- 穿山甲SDK更新至 open_ad_sdk_3.8.0.3 , 适配相关逻辑
- 增加APSDK_v4.4.6.1上游SDK
- 增加读取隐私权限设置接口
- 修复已知BUG
# 2021-06-09 版本号: 2.522
- 广点通SDK更新至 4.362.1232 ,适配相关逻辑
# 2021-05-18 版本号: 2.52
- 广点通SDK更新至 4.350.1220 ,适配相关逻辑
- 优化开屏超时问题,提升开屏填充率
# 2021-04-20 版本号: 2.512
- 修复已知BUG
# 历史版本
# 2021-04-15 版本号: 2.511
- 穿山甲SDK更新至 3.5.5.0 , 适配相关逻辑
- 删除相关敏感权限
# 2021-03-22 版本号: 2.51
- 开屏加载和展示逻辑分开
- 修复自有广告SDK无填充返回BUG
- Sigmob 更新至 2.52.2
- Oneway 更新至 2.4.9
- 修复已知BUG
# 2021-02-25 版本号: 2.5
- 穿山甲SDK更新至 3.4.5.0
- 广点通SDK更新至 4.332.1202
- 上线先播后审素材审核功能
# 2020-11-03 版本号: 2.42
- 变现猫SDK更新至 3.2.0,修改穿山甲互动视频接入方式
- 广点通SDK更新至 4.294.1164
# 2020-11-03 版本号: 2.4
- 加入Draw信息流的广告形式
- 麦唅广告落地页优化
- 对火眼SDK初始化优化
- 修复快手SDK没有回调问题
- androidx与support的适配
- 穿山甲SDK更新至 3.2.5.1
- 快手SDK更新至 3.3.4.2
# 2020-09-03 版本号: 2.3
- 加入快手SDK 3.3.0.1
- 加入优量宝SDK 1.1.0
- 麦唅激励视频修改样式
- 广点通SDK更新至 4.251.1121
- 穿山甲SDK更新至 3.2.0.6
- 修复已知BUG
# 2020-08-17 版本号: 2.2
- 添加新广告形式(浮标、按钮等广告)
- 修改初始化方式,传入MediaID
- 修复已知BUG