# Android SDK 集成说明

# SDK嵌入

  1. 申请应用的APP ID和广告位ID

请联系相应的商务人员申请账户和相关 ID

如有其他问题,欢迎联系

  1. 导入AAR包

将 Android SDK 包复制到您工程的 libs 目录下,并按如下步骤将其导入:

  • SDK AAR 包下载和获取
  • 打开 Android 项目工程目录
  • 拷贝 mhsdk-2.54.aar广点通SDK穿山甲SDKWSDKOWSDKBXMSDK快手SDK优量宝SDKlibs 目录下,并作项目依赖

以上 SDK 联系商务沟通,选择接入,具体可见火眼平台-接入中心 (opens new window)

  1. 配置 AndroidManifest.xml
    1. 权限申请

      权限申请示例
      <!-- 必须接入,影响广告投放以及收益-->
      <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" />
      
    2. 接入检查

      此步骤用于您进行接入的自我检查,检查 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(不传会影响广告测试及正式广告的填充)

MSA联盟官网地址 (opens new window)

示例中所有的 adId 需要替换成本平台真实的广告位id

示例
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 周期调用

注意事项

  1. 广告超时

    • 广告从拉取到曝光超过 30 分钟,将作为无效曝光
    • 广告从拉取到点击超过 60 分钟,将作为无效点击,不会进行计费
  2. 包含关系

    • 每一个广告数据对应一个 NativeAdContainer
    • 广告展示元素(图片,视频,按钮)必须在 NativeAdContainer 之中,如果不在则会造成点击曝光等事件失效
  3. 原生素材的广告只能曝光一次

  4. 对于原生广告形式,需要进行把 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 设置模板的高度

注意事项

  1. 原生模板广告需要被加载到 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 广告展示成功

注意事项

  1. 插屏广告同一条广告不能重复曝光(一次 load 只能 show 一次)
  2. 插屏展示调用( showAD )必须在 ui 线程内调用
  3. 插屏给开发者的回调( InterstitialListener )全部执行在主线程中(异步回调)
  4. 尽量复用广告实例,不要实例化过多的广告实例,当广告实例不再使用时务必调用 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

  1. 火眼SDK更新至 2.4, 适配开屏新样式相关逻辑

# 2021-08-05 版本号: 2.53

  1. 广点通SDK更新至 unionNormal.4.380.1250 ,适配相关逻辑
  2. 穿山甲SDK更新至 open_ad_sdk_3.8.0.3 , 适配相关逻辑
  3. 增加APSDK_v4.4.6.1上游SDK
  4. 增加读取隐私权限设置接口
  5. 修复已知BUG

# 2021-06-09 版本号: 2.522

  1. 广点通SDK更新至 4.362.1232 ,适配相关逻辑

# 2021-05-18 版本号: 2.52

  1. 广点通SDK更新至 4.350.1220 ,适配相关逻辑
  2. 优化开屏超时问题,提升开屏填充率

# 2021-04-20 版本号: 2.512

  1. 修复已知BUG

# 历史版本

# 2021-04-15 版本号: 2.511

  1. 穿山甲SDK更新至 3.5.5.0 , 适配相关逻辑
  2. 删除相关敏感权限

# 2021-03-22 版本号: 2.51

  1. 开屏加载和展示逻辑分开
  2. 修复自有广告SDK无填充返回BUG
  3. Sigmob 更新至 2.52.2
  4. Oneway 更新至 2.4.9
  5. 修复已知BUG

# 2021-02-25 版本号: 2.5

  1. 穿山甲SDK更新至 3.4.5.0
  2. 广点通SDK更新至 4.332.1202
  3. 上线先播后审素材审核功能

# 2020-11-03 版本号: 2.42

  1. 变现猫SDK更新至 3.2.0,修改穿山甲互动视频接入方式
  2. 广点通SDK更新至 4.294.1164

# 2020-11-03 版本号: 2.4

  1. 加入Draw信息流的广告形式
  2. 麦唅广告落地页优化
  3. 对火眼SDK初始化优化
  4. 修复快手SDK没有回调问题
  5. androidx与support的适配
  6. 穿山甲SDK更新至 3.2.5.1
  7. 快手SDK更新至 3.3.4.2

# 2020-09-03 版本号: 2.3

  1. 加入快手SDK 3.3.0.1
  2. 加入优量宝SDK 1.1.0
  3. 麦唅激励视频修改样式
  4. 广点通SDK更新至 4.251.1121
  5. 穿山甲SDK更新至 3.2.0.6
  6. 修复已知BUG

# 2020-08-17 版本号: 2.2

  1. 添加新广告形式(浮标、按钮等广告)
  2. 修改初始化方式,传入MediaID
  3. 修复已知BUG