米盟聚合广告SDK接入文档(游戏)更新时间: 2025-04-18 17:42:00

SDK版本v2.3.2
aar文件MD5值5cd9cb38b6de7a1551ff4f435b28fcbf
包名com.xiaomi.ad.mediation

一、更新记录

日期版本号更新内容
2025年3月27日2.3.21、修复2.3.0版本因权限冲突导致的兼容性问题;
2、修复banner已知问题;
2025年1月9日2.3.01、更新部分预算源的SDK;
2、横幅(窄版)丰富预算源;
3、原生广告支持模版优选;
4、已知问题修复;
注:若已接入2.3.0版本需在 AndroidManifest.xml 中添加 remove 标签移除com.xiaomi.ad.mediation.mediation.PERMISSION_DO_SOMETHING权限,否则会导致游戏安装失败,示例见:四、接入步骤-第一步。
2024年10月24日2.2.21、隐私适配优化;
2、更新部分预算源SDK;
3、已知问题修复;
2024年10月10日2.2.11、更新部分预算源的SDK;
2、已知问题修复;
2024年9月3日2.2.01、更新部分预算源的SDK;
2、全屏视频插屏(横版)、激励视频-横版、应用内横版开屏丰富预算源;
3、优化横幅(banner)广告自动刷新时的曝光回调;
4、优化SDK初始化成功回调;
5、已知问题修复;
2024年7月10日2.1.01、丰富原生模板预算源;
2、已知问题修复;
2024年5月6日2.0.01、丰富预算源;
2、聚合策略能力优化;
3、已知问题修复
2023年12月19日1.9.21、视频广告支持“边下边播”能力
2、模版类广告扩展预算
3、提供“一键诊断”工具
4、适配米盟广告SDK(应用)v5.3.0。需在build.gradle添加 packageingOptions 配置(详见接入文档)
2023年11月03日1.9.1更新了米盟SDK(如AGP版本较低(<3.6.0)请在build.gradle添加 packageingOptions 配置,详见接入文档)
2023年09月25日1.9.0更新了优量汇SDK(需在AndroidManifest.xml增加优量汇配置,详见接入文档)增加onetrack依赖(需在build.gradle中增加配置,详见接入文档第三步新增依赖)
2023年09月04日1.8.9更新了穿山甲SDK(需在AndroidManifest.xml增加穿山甲配置,详见接入文档)移除了MIMOAdSdkConfig中的setStaging方法
2023年08月15日1.8.8新增:MMFeedAd 增加六要素 -- getIntroductionUrl() 方法(获取应用介绍)

二、功能目标

米盟聚合广告SDK集成米盟等多家广告SDK功能,便利开发者集成,提供各种广告形式给客户端,提高广告填充率。

三、zip包说明

zip包中 demo 可以作为接入参考

zip包中 mimo_sdk.aar 包放在libs

四、接入步骤

第一步:配置AndroidManifest.xml SDK需要的权限列表

 //必要权限配置
<uses-permission android:name="android.permission.INTERNET" />
//以下2个权限为非必要权限,可不申请
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

注:2.3.0版本需在 AndroidManifest.xml 中添加 remove 标签移除com.xiaomi.ad.mediation.mediation.PERMISSION_DO_SOMETHING权限,否则会导致游戏安装失败,具体如下:

//2.3.0版本必须要去除该自定义权限
<permission
android:name="com.xiaomi.ad.mediation.mediation.PERMISSION_DO_SOMETHING"
tools:node="remove" />

第二步:SDK需要的provider和网络配置声明

1、添加米盟 provider

在 res/xml/下添加如下1个配置文件:mimo_file_paths.xml, 注:不要修改文件名称,可参考demo

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path path="mimoDownload" name="files_root" />
<external-path path="." name="external_storage_root" />
</paths>

在AndroidManifest.xml添加如下provider节点,可以参考demo

<manifest>
<application>

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/mimo_file_paths" />
</provider>

</application>
</manifest>

2、添加穿山甲provider(1.8.9、1.9.0版本)

在 res/xml/下添加如下1个配置文件:file_paths.xml, 注:不要修改文件名称,可参考demo

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="tt_external_root" path="." />
<external-path name="tt_external_download" path="Download" />
<external-files-path name="tt_external_files_download" path="Download" />
<files-path name="tt_internal_file_download" path="Download" />
<cache-path name="tt_internal_cache_download" path="Download" />
<!--为了适配所有路径可以设置 path = "." -->
</paths>

在AndroidManifest.xml添加如下provider节点,可以参考demo(1.9.1版本需移除以下配置,否则可能崩溃)

<manifest>
<application>

<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/file_paths" />
</provider>
<provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider"
android:exported="false" />
</application>
</manifest>

3、添加优量汇provider (1.9.0版本)
在 res/xml/下添加如下1个配置文件:gdt_file_path.xml, 注:不要修改文件名称,可参考demo

<?xml version="1.0" encoding="utf-8"?>
<paths>
<!-- 这个下载路径也不可以修改,必须为GDTDOWNLOAD -->
<external-cache-path
name="gdt_sdk_download_path1"
path="com_qq_e_download" />
<cache-path
name="gdt_sdk_download_path2"
path="com_qq_e_download" />
</paths>

在AndroidManifest.xml添加如下provider节点,可以参考demo(1.9.1版本需移除以下配置,否则可能崩溃)

<manifest>
<application>

<provider
android:name="com.qq.e.comm.GDTFileProvider"
android:authorities="${applicationId}.gdt.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/gdt_file_path" />
</provider>

</application>
</manifest>

4、添加HTTP支持(不添加可能导致广告资源下载失败)

在 res/xml/下添加如下1个配置文件:network_security_config.xml,可参考demo

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
<debug-overrides>
<trust-anchors>
<!-- Trust user added CAs while debuggable only -->
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>

在AndroidManifest.xml中application标签添加android:networkSecurityConfig、android:usesCleartextTraffic属性

如下:(如不配置可能导致一些http资源下载失败)

<application
android:name=".MMApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning"
tools:replace="android:allowBackup">

</application>

第三步:build.gradle配置

ndk过滤:

 ndk { // 设置支持的 SO 库构架,注意这里要根据你的实际情况来设置 
abiFilters armeabi-v7a , arm64-v8a
}

Java8配置:

 compileOptions {  sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

关闭so压缩(1.9.1版本及以上可选)

如果运行后出现如下崩溃,请在build.gradle添加 packageingOptions 配置:

java.lang.UnsatisfiedLinkError: dlopen failed: empty/missing DT_HASH/DT_GNU_HASH in 
"/data/app/~~d-MvjvQe56StSJP3MLJEag==/com.xiaomi.ad.mediation.demo.mi-uPkaSzKDLWRqoKvlXCNxgQ==/lib/arm64/libijiami_1011.so" (new hash type from the future?)
at java.lang.Runtime.loadLibrary0(Runtime.java:1077)
at java.lang.Runtime.loadLibrary0(Runtime.java:998)
at java.lang.System.loadLibrary(System.java:1656)
at ijiami_1011.NCall.<clinit>(Unknown Source:2)
at ijiami_1011.NCall.IV(Native Method)
at com.miui.zeus.mimo.sdk.utils.android.AndroidUtils.<clinit>(Unknown Source:12)
at com.miui.zeus.mimo.sdk.utils.android.AndroidUtils.isMainThread(Unknown Source:0)
at com.miui.zeus.mimo.sdk.utils.TaskRunner.runOnMainThread(TaskRunner.java:1)
at com.miui.zeus.mimo.sdk.MimoSdk.init(MimoSdk.java:2)
at com.xiaomi.ad.mediation.sdk.f00.a(InitSdkHolder.java:29)
at com.xiaomi.ad.mediation.mimonew.MiMoNewSdk.init(MiMoNewSdk.java:16)

1.9.2版本及以上

android {
packagingOptions {
doNotStrip "*/*/libmimo_1011.so"
doNotStrip "*/*/libzeusLib.so"
}
}

1.9.1版本及以下

android {
packagingOptions {
doNotStrip "*/*/libijiami_1011.so"
doNotStrip "*/*/libzeusLib.so"
}
}

依赖:

dependencies {
/* 引用新米盟sdk mimo_sdk*/
implementation(name: 'mimo_sdk', ext: 'aar')
//注意:以下5个库必须要引入***
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}

新增依赖(1.9.0版本及以上)

在根目录的build.gradle文件中增加:

allprojects {
repositories {
google()
jcenter()
/* onetrack 远程仓库依赖 */
maven {
url "https://repos.xiaomi.com/maven"
credentials {
username 'mi-gamesdk'
password 'AKCp8mYeLuhuaGj6bK1XK7t2w4CsPuGwg6GpQdZ9cat7K59y5sD7Tx3dHjJcFrBGj3TQ4vi7g'
}
}
}
}

添加onetrack版本依赖

dependencies {
/* 依赖onetrack*/
implementation "com.xiaomi.gamecenter.sdk:onetrack-sdk:2.1.2"
}

注:如果有依赖联运SDK,onetrack版本需要保持一致,最低不要小于2.0.4版本

第四步:初始化SDK

/**
*
* @param Context 上下文
* @param AppId 米盟appid
* @param AppName 应用名称
* @param MIMOAdSdkConfig 米盟sdk环境配置,线上: setDebugLog(fasle) setStaging(false)
* @param IMediationConfigInitListener 初始化结果回调,onSuccesson表示成功(只有成功才能后续请求广告)Failed表示失败
*/
MiMoNewSdk.init(getApplicationContext(), appId, appName,
new MIMOAdSdkConfig.Builder()
.setDebug(true) // debug 为true , 关闭debug:false
.build(), new IMediationConfigInitListener() {
@Override
public void onSuccess() {
MLog.d(TAG, "mediation config init success");
}

@Override
public void onFailed(int errorCode) {
MLog.d(TAG, "mediation config init failed");
}
});

注:2.2.0以下版本初始化完成后如果立即请求广告,需要延迟至少500ms
注:1.8.9及以上已删除 setStaging 方法。请确保在有网络时初始化聚合SDK

第五步:不同广告类型输入

Banner集成

1、请求Banner广告

/**
* @param activity banner广告的Activity
* @param mContainer banner广告的container
* @param upid 广告位id
*/
public void loadAd(Activity activity, ViewGroup container, String upId) {
container.removeAllViews();//清空容器view,供sdk填充广告MMAdConfig adConfig = new MMAdConfig();
adConfig.supportDeeplink = true; // 期望的广告是否支持deeplink
adConfig.imageWidth = 640;
adConfig.imageHeight = 320;
/**
* 设置的容器宽高不能超过屏幕,设置的view宽高不能超过容器
* 推荐设置: 320*50dp, 如果有遮挡问题 可以尝试 360*54 300*45 等比例,可参照demo
* view宽高比:6.4:1(不可以大于该比例),用于控制广告大小,单位dp,建议和容器宽高值保持一致
*/
adConfig.viewWidth = 320;
adConfig.viewHeight = 50;
adConfig.setBannerContainer(container);// banner广告的container 建议宽横向充满, 高度自适应或按照平台勾选的比例设置容器宽高
adConfig.setBannerActivity(activity); // banner广告所在的Activity

mAdBanner = new MMAdBanner(activity, upid);
mAdBanner.onCreate(); //必须调用 用于统计和广告位创建
mAdBanner.load(adConfig, new MMAdBanner.BannerAdListener() {

@Override
public void onBannerAdLoaded(List<MMBannerAd> list) {
if (list != null && list.size() > 0) {
mBannerAd = list.get(0);
}
}

@Override
public void onBannerAdLoadError(MMAdError error) {
//加载失败
}
});
}

2、展示广告

private void showAd() {
if (mBannerAd == null) {
return;
}
mBannerAd.show(new MMBannerAd.AdBannerActionListener() {
@Override
public void onAdShow() {
//广告展示
}

@Override
public void onAdClicked() {
//广告被点击
}

@Override
public void onAdDismissed() {
//广告消失
}

@Override
public void onAdRenderFail(int code, String msg) {
//广告渲染失败
}
});
}

3、销毁Banner广告

在不再需要广告时,销毁广告

注:如果在click回调直接销毁,需至少延迟200ms销毁

@Override 
public void onDestroy() {
if (mBannerAd != null) {
mBannerAd.destroy();
}
}

激励视频集成

1、 请求激励视频广告

public void load(Activity activity, String upId) {

MMAdConfig adConfig = new MMAdConfig();
adConfig.supportDeeplink = true;
adConfig.imageHeight = 1920;
adConfig.imageWidth = 1080;

//期望广告view的size,单位dp(*必填)
adConfig.viewWidth = 1080;
adConfig.viewHeight = 1920;
adConfig.rewardCount = 5;

adConfig.setRewardVideoActivity(activity);
MMAdRewardVideo rewardVideo = new MMAdRewardVideo(activity, upId);
rewardVideo.onCreate(); //必须调用,用于统计

rewardVideo.load(adConfig, new MMAdRewardVideo.RewardVideoAdListener() {

@Override
public void onRewardVideoAdLoaded(MMRewardVideoAd mmRewardVideoAd) {
if (mmRewardVideoAd != null) {
rewardVideoAd = mmRewardVideoAd;
} else {
Log.e(TAG, "广告请求成功,但无填充");
}
}

@Override
public void onRewardVideoAdLoadError(MMAdError mmAdError) {
Log.e(TAG, "广告加载失败" + mmAdError.toString());
}
});
}

2、显示激励视频广告

在请求广告成功后,可以显示激励视频广告

public void showAd(Activity activity){
if (rewardVideoAd == null){
return;
}
rewardVideoAd.setInteractionListener(new MMRewardVideoAd.RewardVideoAdInteractionListener() {
@Override
public void onAdShown(MMRewardVideoAd mmRewardVideoAd) {
//广告展示
}
@Override
public void onAdClicked(MMRewardVideoAd mmRewardVideoAd) {
//广告已点击
}
@Override
public void onAdError(MMRewardVideoAd mmRewardVideoAd, MMAdError mmAdError) {
//广告展示出现错误
}
@Override
public void onAdVideoComplete(MMRewardVideoAd mmRewardVideoAd) {
//广告视频播放完成
}
@Override
public void onAdClosed(MMRewardVideoAd mmRewardVideoAd) {
//广告关闭
}
@Override
public void onAdReward(MMRewardVideoAd mmRewardVideoAd, MMAdReward mmAdReward) {
//广告奖励回调
}
@Override
public void onAdVideoSkipped(MMRewardVideoAd mmRewardVideoAd) {
//广告跳过
}
});
rewardVideoAd.showAd(activity);
}

插屏集成

1、请求广告

/**
* @param activity 当前Activity的上下文
* @param upId 广告位id
* @param isHorizontal 是否为横版插屏广告,默认为false
*/
public void loadAd(Activity activity, String upId, boolean isHorizontal) {
MMAdConfig adConfig = new MMAdConfig();
adConfig.supportDeeplink = true;
adConfig.imageWidth = 1080;
adConfig.imageHeight = 1920;
//期望广告view的size,单位dp(必填)
adConfig.viewWidth = 1080;
adConfig.viewHeight = 1920;
if (isHorizontal){
adConfig.interstitialOrientation = MMAdConfig.Orientation.ORIENTATION_HORIZONTAL;
} else {
adConfig.interstitialOrientation = MMAdConfig.Orientation.ORIENTATION_VERTICAL;
}
adConfig.setInsertActivity(activity);
MMAdFullScreenInterstitial interstitial = new MMAdFullScreenInterstitial(activity, upId);
interstitial.onCreate(); //必须调用
interstitial.load(adConfig, new MMAdFullScreenInterstitial.FullScreenInterstitialAdListener() {
@Override
public void onFullScreenInterstitialAdLoaded(MMFullScreenInterstitialAd mmFullScreenInterstitialAd) {
if (mmFullScreenInterstitialAd != null) {
fullScreenInterstitialAd = mmFullScreenInterstitialAd;
} else {
Log.e(TAG, "加载广告失败,无广告填充");
}
}
@Override
public void onFullScreenInterstitialAdLoadError(MMAdError mmAdError) {
Log.e(TAG, "加载广告失败, " + mmAdError.toString());
}
});
}

2、展示广告

private void showAd(Activity  activity){
if (fullScreenInterstitialAd == null) {
return;
}

fullScreenInterstitialAd.setInteractionListener(new MMFullScreenInterstitialAd.FullScreenInterstitialAdInteractionListener() {

@Override
public void onAdShown(MMFullScreenInterstitialAd mmFullScreenInterstitialAd) {
//广告展示
}

@Override
public void onAdClicked(MMFullScreenInterstitialAd mmFullScreenInterstitialAd) {
//广告被点击
}

@Override
public void onAdVideoComplete(MMFullScreenInterstitialAd mmFullScreenInterstitialAd) {
//视频播放完成
}

@Override
public void onAdClosed(MMFullScreenInterstitialAd mmFullScreenInterstitialAd) {
//广告关闭
}

@Override
public void onAdVideoSkipped(MMFullScreenInterstitialAd mmFullScreenInterstitialAd) {
//广告跳过
}

@Override
public void onAdRenderFail(MMFullScreenInterstitialAd mmFullScreenInterstitialAd, int code, String message) {
//广告渲染失败
}
});
fullScreenInterstitialAd.showAd(activity);
}

3、销毁广告

在合适的时机销毁广告

@Override
public void onDestroy() {
super.onDestroy();
if (fullScreenInterstitialAd != null) {
fullScreenInterstitialAd.onDestroy();
}
}

开屏集成

1、请求并展示开屏广告

public void load(Activity activity, ViewGroup container, String upId) {
MMAdConfig adConfig = new MMAdConfig();
adConfig.supportDeeplink = true;
adConfig.imageHeight = 1920;
adConfig.imageWidth = 1080;
adConfig.setSplashActivity(activity);
adConfig.setSplashContainer(container);
mAdSplash = new MMAdSplash(activity, upId);
mAdSplash.onCreate();//必须调用
mAdSplash.load(adConfig, new MMAdSplash.SplashAdInteractionListener() {
@Override
public void onAdSkip() {
//点击跳过
}
@Override
public void onError(MMAdError error) {
//展示出现异常
}
@Override
public void onAdShow() {
//广告展示
}
@Override
public void onAdClicked() {
//广告点击
}
@Overrid
epublic void onAdDismissed() {
//广告消失
}
});
}

原生模板集成

1、请求模板广告

/**
*
* @param context 上下文
* @param container 模版广告的gucontainer
* @param upId 广告位id
* 建议设置容器宽度x:375dp<x<屏幕宽度,高度自适应,以匹配更丰富的预算
* 由于部分广告源为透明底色,请自行设置广告容器底色背景,保证广告展示清晰
*/
public void load(Context context, ViewGroup container, String upId) {
MMAdConfig adConfig = new MMAdConfig();
adConfig.imageHeight = 1920;
adConfig.imageWidth = 1080;
adConfig.setTemplateContainer(container);
mAdTemplate = new MMAdTemplate(context, upId);
mAdTemplate.onCreate(); //必须调用
mAdTemplate.load(adConfig, new MMAdTemplate.TemplateAdListener() {
@Override
public void onTemplateAdLoaded(List<MMTemplateAd> list) {
if (list != null && list.size() > 0) {
templateAd =list.get(0);
} else {
Log.e(TAG, "加载广告失败,无广告填充");
}
}
@Override
public void onTemplateAdLoadError(MMAdError error) {
Log.e(TAG, "加载广告失败, " + error.toString());
}
});
}

2、展示模板广告

在请求广告成功后,可以显示模板广告

public void showAd(){
if (templateAd == null){
return;
}
templateAd.showAd(new MMTemplateAd.TemplateAdInteractionListener() {
@Override
public void onAdLoaded() {
//广告加载成功
}
@Override
public void onAdRenderFailed() {
//广告加载失败
}
@Override
public void onError(MMAdError mmAdError) {
//广告展示出现异常
}
@Override
public void onAdShow() {
//广告已展示
}
@Override
public void onAdClicked() {
//广告被点击
}
@Override
public void onAdDismissed() {
//广告关闭
}
});
}

个性化推荐广告开关设置

1、打开个性化推荐广告开关

 MiMoNewSdk.setPersonalizedAdEnabled(true);

2、关闭个性化推荐广告开关

 MiMoNewSdk.setPersonalizedAdEnabled(false);

最后混淆配置:

# keep mediation sdk
-keep class com.xiaomi.ad.mediation.** { *; }
# keep mimo sdk
-keepclasscom.miui.zeus.** { *; }

错误码列表

注:以下说明中仅包含客户端错误码说明及对应调优建议,请开发者前往小米移动广告联盟平台-填充率诊断模块查看服务端错误码说明及对应调优建议(填充率诊断功能操作指南)

开发者请先根据常见错误码定位问题,如以下内容无法涵盖开发者疑问,可以通过工单系统咨询

code含义备注
-100没有请求到广告检查后台配置是否正确
-200请求超时检查网络
-300请求广告错误建议过滤errorMessage排查
-400传入的appId和广告位id不一致,导致无法找到广告位id信息-
-500没有传入TagId广告位信息请传入TagId进行请求
-600没有设置图片尺寸需要设置尺寸,参照demo
-700没有设置该广告形式的Adapter,请参考初始化相关文档-
-800通用错误米盟广告SDK不支持此广告类型
-900SDK未初始化完成就请求了广告位-
-1000创建第三方DSP Loader失败-
-2000显示广告失败广告渲染异常
-2100显示的广告已过期-
-2200要显示的广告已经显示过-
-9000SDK初始化未完成,提前加载广告请在SDK初始化完成后再请求广告
3解析响应的数据时出现异常核查广告位是否已开启,开启后预计生效时长约为15分钟
5返回广告的数据为空-
6创建连接时出现异常-
101返回广告数据中的广告信息为空-

五、一键诊断工具

为了方便开发者可以快速定位广告接入中碰到的问题,您可以尝试使用sdk提供的快速测试工具

步骤如下:

1、初始化打开debug开关

2、重启App, 开始广告加载流程

3、通过adb发生广播:adb shell am broadcast -a com.xiaomi.ad.mimo.diagnosis

4、logcat过滤“Mimo-Diagnosis"查看即可看到分析报告

文档内容是否有帮助?
有帮助
无帮助