通知 :自15.4.6版本起,Mintegral SDK更换了SDK包名和各个广告类型的类文件名称,集成sdk在15.4.6之前版本的开发者升级此版本后需要对新SDK进行使用修改,目前需要改动的地方有:
1.Maven仓库配置地址。下载依赖gradle语句。
2.SDK初始化代码。
3.各个广告类型调用代码(接口无变化,类名称发生更改)。
4.混淆配置信息更改(如用到),资源缩减配置更改(如用到),资源混淆白名单配置更改(如用到),下载器适配更改(如用到),详见'AndoridManifest.xml配置'一列。
5.用jar包集成的开发者,需要更改对应集成广告类型的Activity注册信息,详见'AndoridManifest.xml配置'一列。
</font>
MTGInterstitialVideoHandler
MBInterstitialVideoHandler
概要
本文档描述了Android开发者如何集成Mintegral SDK产品,通过集成MBridge sdk 展示广告创造收益。 Mintegral SDK提供了9种广告形式,包括:Banner(横幅广告)、Native(原生广告)、NativeVideo(原生视频)、Automatic Rending Native(自动渲染原生广告)、RewardVideo(激励性视频)、Interstitial(插屏)、Interstitial Video(插屏视频)、InterActive(试玩广告)、Splash(开屏广告)。
获取SDK
请根据以下提示选择您的集成方式,点击“开始集成”获取SDK
Demo
在手动下载SDK的zip包里,名称为MBTest 的是此下载版本对应的Demo
获取SDK版本号
MBConfiguration.SDK_VERSION
注意: 如果使用gradle方式拉取代码失败,在项目根build.gradle文件中添加maven仓库配置。
Copy //非上架GP市场应用 安卓X版本
maven {
url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_china"
}
//上架GP市场应用 安卓X版本
maven {
url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea"
}
//非上架GP市场应用 非安卓X版本
maven {
url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_support/"
}
</font>
截图展示:
AndroidManifest.xml 配置
1.必要权限
注:如果使用了国内流量版SDK ,"READ_PHONE_STATE"此条权限必须加上,如果Android系统6.0以上,需要动态申请此权限。
Copy <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 如果国内流量版本SDK ,以下两条权限必须加上 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
2.广告展示Activity清单配置(如果您使用的是aar或者gradle方式集成,可以忽略此步骤)。
Copy <activity
android:name="com.mbridge.msdk.activity.MBCommonActivity"
android:configChanges="keyboard|orientation"
android:excludeFromRecents="true"
android:exported="false"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
<activity
android:name="com.mbridge.msdk.shell.MBActivity"
android:configChanges="keyboard|orientation|screenSize"
android:excludeFromRecents="true"
android:theme="@style/MBridgeAppTheme"/>
<!--激励视频和插屏视频广告所需Activity-->
<activity
android:name="com.mbridge.msdk.reward.player.MBRewardVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:excludeFromRecents="true"
android:theme="@style/mbridge_transparent_theme" />
<!--插屏图片广告所需Activity-->
<activity
android:name="com.mbridge.msdk.interstitial.view.MBInterstitialActivity"
android:configChanges="orientation|screenSize"
android:excludeFromRecents="true" />
<!--交互广告所需Activity-->
<activity
android:name="com.mbridge.msdk.interactiveads.activity.InteractiveShowActivity"
android:excludeFromRecents="true"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"/>
2.下载器适配(如果您使用的是aar或者gradle方式集成,可以忽略此步骤)。
(1)将Android Support v4包升级到26.0.0或以上。
(2)如果targetSDKVersion >= 24,需要适配FileProvider。 国内流量版本必需,海外版本可以不添加。
在xml文件下添加mb_provider_paths.xml
Copy <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
在AndroidManifest.xml文件中添加如下代码
Copy //国内流量版本必需,海外版本可以不添加。
<provider
android:name="com.mbridge.msdk.foundation.tools.MBFileProvider"
android:authorities="${applicationId}.mbFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/mb_provider_paths"/>
</provider>
3.混淆配置
(1)AndroidX的混淆配置
Copy -keepattributes Signature
-keepattributes *Annotation*
-keep class com.mbridge.** {*; }
-keep interface com.mbridge.** {*; }
-keep interface androidx.** { *; }
-keep class androidx.** { *; }
-keep public class * extends androidx.** { *; }
-dontwarn com.mbridge.**
-keep class **.R$* { public static final int mbridge*; }
(2)非AndroidX的混淆配置
Copy -keepattributes Signature
-keepattributes *Annotation*
-keep class com.mbridge.** {*; }
-keep interface com.mbridge.** {*; }
-keep class android.support.v4.** { *; }
-dontwarn com.mbridge.**
-keep class **.R$* { public static final int mbridge*; }
4.资源缩减配置
如果开启了shrinkResources,需要进行以下配置:
新增res/raw/keep.xml文件,添加如下内容:
Copy <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/mbridge*,@drawable-hdpi-v4/mbridge*,@drawable-hdpi/mbridge*,@layout/mbridge*,@values/mbridge*,@anim/mbridge*" />
5.资源混淆白名单配置
Copy "R.string.mbridge*",
"R.layout.mbridge*",
"R.drawable.mbridge*",
"R.anim.mbridge*",
"R.color.mbridge*",
"R.style.mbridge*",
"R.id.mbridge*"
6.智能下载配置
Note:开启智能下载的功能,即“边下边播”,将有益于广告load的成功率
对于AndroidX,在14.2.5版本及以后 ,如果在Android9.0及以上 要开启此功能,需要进行配置
对于非AndroidX,在10.5.0版本及以后 ,如果在Android9.0及以上 要开启此功能,需要进行配置
配置方法:
(1)在res目录下,创建network_security_config.xml文件,内容如下:
Copy <?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--- you need config the domain in your file,it will help us to cache video -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">127.0.0.1</domain>
</domain-config>
</network-security-config>
(2)在 AndroidManifest.xml 的application标签,增加如下配置:
Copy android:networkSecurityConfig="@xml/network_security_config"
SDK初始化
作为集成的第一步,你需要先将Mintegral的SDK进行初始化。
将Mintegral SDK添加至您的项目
通过JAR/AAR包集成
same.jar/aar
chinasame.jar/aar
AutomaticRendingNative广告功能包
Tips: same.aar/chinasame.aar是公共基础包,是每种广告形式都必须要添加的, 如果要实现某种功能,必须要添加对应的aar包。例如要集成的是Splash形式的广告,需要放same.aar/chinasame.aar、mbsplash.aar。 如果是jar包集成的话除了将jar包添加之外,还需要将它对应的res文件导入项目。
初始化
1.在application里的如下方法中调用初始化方法,传入在Mintegral后台得到的AppID和AppKey。建议在主线程调用此方法,并且尽量在你应用启动时,越早初始化SDK越好。保证SDK在应用程序中只初始化一次,可以参考Demo中的MBridgeSDKManager.java工具类
我们提供两种初始化SDK的方式:
(1)不带回调的初始化
Copy public void init(Map<String,String> ids,Application application);
示例代码:
Copy MBridgeSDK sdk = MBridgeSDKFactory.getMBridgeSDK();
Map<String, String> map = sdk.getMBConfigurationMap("your AppId", "your AppKey");
sdk.init(map, this);
(2)带回调的初始化
注:
AndroidX:14.1.0及以上版本,SDK提供初始化状态的回调
非AndroidX:10.4.0及以上版本,SDK提供初始化状态的回调
Copy public void init(Map<String,String> ids, Application application, SDKInitStatusListener listener);
示例代码:
Copy MBridgeSDK sdk = MBridgeSDKFactory.getMBridgeSDK();
Map<String, String> map = sdk.getMBConfigurationMap("your AppId", "your AppKey");
sdk.init(map, this, new SDKInitStatusListener() {
@Override
public void onInitSuccess() {
Log.e("SDKInitStatus", "onInitSuccess");
}
@Override
public void onInitFail() {
Log.e("SDKInitStatus", "onInitFail");
}
});
预加载广告(强烈建议)
我们对Native(NativeVideo)这两种广告形式提供预加载功能,可以在SDK初始化的时候调用以下代码来进行预加载,提高你的广告加载效率。示例代码如下:
Copy MBridgeSDK sdk = MBridgeSDKFactory.getMBridgeSDK();
Map<String, Object> preloadMap = new HashMap<String, Object>();
preloadMap.put(MBridgeConstans.PROPERTIES_LAYOUT_TYPE, MBridgeConstans.LAYOUT_NATIVE);//设置广告形式为native
preloadMap.put(MBridgeConstans.PROPERTIES_UNIT_ID,"your unitId");
preloadMap.put(MBridgeConstans.PROPERTIES_AD_NUM, 1);
preloadMap.put(MBridgeConstans.PLACEMENT_ID, "your placementId");
sdk.preload(preloadMap);
横幅广告接入
横幅广告是移动广告最传统的广告类型,易于实现,用户接受度高,对于超休闲游戏和工具类产品是一种很好的变现形式。
广告效果示意:
初始化MBBannerView
在xml中加入MBBannerView,或动态加载MBBannerView。
注意:动态加载MBBannerView时,SDK不会控制View的大小,所以需要setLayoutParams给view设定宽高。
Example:
Copy mbBannerView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
定义MBBannerView,如下代码:
Copy public MBBannerView(Context context){
this(context,null);
}
public void init(BannerSize bannerSize, String placementId, String unitId);
BannerSize 介绍:
Copy /**
* sizeType
*/
//表示固定横幅广告尺寸-320dp x 90dp.
public static final int LARGE_TYPE = 1;
//表示固定横幅广告尺寸-300dp x 250dp.
public static final int MEDIUM_TYPE = 2;
//如果设备高度<= 720,则表示固定的横幅广告尺寸-320dp x 50dp;
if device height > 720,Represents the fixed banner ad size - 728pt by 90pt.
public static final int SMART_TYPE = 3;
//表示固定横幅广告尺寸-320dp x 50dp.
public static final int STANDARD_TYPE = 4;
//根据您的需求定制尺寸.
public static final int DEV_SET_TYPE = 5;
/**
* @param 尺寸类型
* @param showWidth:您需要的宽度
* @param showHeight: 您需要的高度
*/
public BannerSize(int sizeType,int showWidth,int showHeight);
MBBannerView功能API介绍
Copy /**
* @param 是否允许展示关闭按钮.
*/
public void setAllowShowCloseBtn(boolean allowShowCloseBtn)
/**
自动刷新时间(以秒为单位)设置在10s〜180s的范围内.
如果设置为0,则不会自动刷新.
需要在load广告之前调用.
*/
public void setRefreshTime(int refreshTime){
if(controller != null){
controller.setRefreshTime(refreshTime);
}
}
设置回调函数
对于广告请求,需要设置回调的方法有以下几个:
Copy public interface BannerAdListener {
/**
* 广告加载失败时调用
*/
void onLoadFailed(String msg);
/**
* 广告加载成功时调用
*/
void onLoadSuccessed();
/**
* 广告展示时调用
*/
void onLogImpression();
/**
* 广告点击时调用
*/
void onClick();
/**
* 点击广告后离开应用时调用
*/
void onLeaveApp();
/**
* 空实现方法,可以忽略
*/
void showFullScreen();
/**
* 空实现方法,可以忽略
*/
void closeFullScreen();
/**
* 广告关闭时调用
*/
void onCloseBanner();
}
请求并展示广告
方法如下:
获取Request ID
SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到Mintegral
Copy /**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()
释放MBBannerView对象
在适当的时机调用release()方法来释放MBBannerView对象的内存空间
Copy @Override
protected void onDestroy() {
super.onDestroy();
if(mbBannerView!= null){
mbBannerView.release();
}
}
示例代码
Copy xml:
<com.mbridge.msdk.out.MBBannerView
android:id="@+id/mb_banner_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
java:
mbBannerView = findViewById(R.id.mb_banner_view);
mbBannerView(new BannerSize(BannerSize.DEV_SET_TYPE,1294,720), "your placementId", UNIT_ID);
mbBannerView(true);
mbBannerView.setRefreshTime(15);
mbBannerView.setBannerAdListener(new BannerAdListener() {
@Override
public void onLoadFailed(String msg) {
ShowToast("on load failed"+msg);
Log.e(TAG, "on load failed"+msg);
}
@Override
public void onLoadSuccessed() {
ShowToast("on load successd");
Log.e(TAG, "on load successed");
}
@Override
public void onClick() {
ShowToast("onAdClick");
Log.e(TAG, "onAdClick");
}
@Override
public void onLeaveApp() {
ShowToast("leave app");
Log.e(TAG, "leave app");
}
@Override
public void showFullScreen() {
ShowToast("showFullScreen");
Log.e(TAG, "showFullScreen");
}
@Override
public void closeFullScreen() {
ShowToast("closeFullScreen");
Log.e(TAG, "closeFullScreen");
}
@Override
public void onLogImpression() {
ShowToast("onLogImpression");
Log.e(TAG, "onLogImpression");
}
@Override
public void onCloseBanner() {
ShowToast("onCloseBanner");
Log.e(TAG, "onCloseBanner");
}
});
mbBannerView.load();
原生(视频)广告接入
原生广告是时下非常流行的广告类型之一,广告sdk会将素材信息返回给您的app,您可以根据需要对元素进行组装和渲染,进而更贴近您的产品风格,用户体验更好。
注:该广告类型仅对部分开发者提供,如有需要请联系您的AM或致信developer@mintegral.com
广告效果示意:
初始化MBNativeHandler
定义MBNativeHandler,如下代码:
Copy public MBNativeHandler(Map<String, Object> map, Context context);
建议context 使用Application对象
设置回调函数
对于广告请求,需要设置回调的方法有以下几个:
Copy public interface NativeAdListener {
/**
* 广告加载成功时调用
*/
public void onAdLoaded(List<Campaign> campaigns, int template);
/**
* 广告加载失败时调用
*/
public void onAdLoadError(String message);
/**
* 广告点击时调用
*/
public void onAdClick(Campaign campaign);
/**
* 点击广告时调用(可以忽略)
*/
public void onAdFramesLoaded(List<Frame> list);
/**
* 广告展示时调用
*/
public void onLoggingImpression(int adsourceType);
}
设置广告展示和点击之后的回调函数,回调方法有以下几个:
Copy public interface NativeTrackingListener {
/**
* 截取显示默认的加载对话框
*/
public boolean onInterceptDefaultLoadingDialog();
/**
* 显示默认对话框时调用
*/
public void onShowLoading(Campaign campaign);
/**
* 默认对话框关闭时调用
*/
public void onDismissLoading(Campaign campaign);
/**
* called when Ads start to redirection
*/
public void onStartRedirection(Campaign campaign, String url);
/**
* 广告开始重定向时调用
*/
public void onFinishRedirection(Campaign campaign, String url);
/**
* 广告完成重定向失败时调用
*/
public void onRedirectionFailed(Campaign campaign, String url);
/**
* 广告开始下载时调用
*/
public void onDownloadStart(Campaign campaign);
/**
* 广告下载完成后调用
*/
public void onDownloadFinish(Campaign campaign);
/**
* 广告下载时调用
*/
public void onDownloadProgress(int progress);
}
请求广告
Mintegral sdk调用此方法时会优先从缓存里读取广告,如果缓存里有广告,则直接返回,进而提升展示效率;如果缓存里没有,则会向服务器发送广告请求获取广告。
注意:我们不建议开发者对campaign对象做缓存处理 请求方法如下:
Copy public abstract boolean load();
渲染广告
您可以根据onAdLoaded的回调去渲染广告,同时对于原生广告我们会提供MBMediaView去展示图片(视频)广告。MBMediaView最佳设置的展示大小比例为16:9。 调用以下方法去展示广告:
Copy public void setNativeAd(Campaign campaign)
广告选择图标
我们提供MBAdChoice来渲染广告标记(Adchoice)。它是一个继承自ImageView的类。调用以下方法去渲染Adchoice。
Tip:我们强烈建议开发者规划合适位置展示此图标,若未展示,会影响您后续的广告收益。
Copy public void setCampaign(Campaign campaign)
注册点击跳转事件
对view设置广告点击跳转事件
Copy //注册可以点击跳转的视图
//如果开发者自己加载广告图片,请在图片加载完成之后调用registerView
public void registerView(View view, Campaign campaign)
public void registerView(View view, List<View> views, Campaign campaign)
释放NaitveHandler对象
在适当的时机调用release()方法来释放NaitveHandler对象的内存空间
Copy @Override
protected void onDestroy() {
if (mNativeHandle != null) {
mNativeHandle.release();
}
}
Copy // 设置MBMediaView是否可以全屏显示
public void setIsAllowFullScreen(boolean isAllowFullScreen)
// 设置在视频是否允许刷新
public void setAllowVideoRefresh(boolean allowVideoRefresh)
// 设置视频是否要循环播放
public void setAllowLoopPlay(boolean allowLoopPlay)
// 设置当手机方向在水平和垂直之间交替时是否重新加载视频
public void setAllowScreenChange(boolean allowScreenChange)
/**
* 设置视频进度视图可见性
*
* @param isShown
*/
public void setProgressVisibility(boolean isShown)
/**
* 设置声音指示器视图可见性
*
* @param isShown
*/
public void setSoundIndicatorVisibility(boolean isShown)
/**
* 开启或关闭视频声音
*
* @param 开关
*/
public void setVideoSoundOnOff(boolean isOn)
public interface OnMBMediaViewListenerPlus {
//当mediaview进入全屏模式时调用
void onEnterFullscreen();
//当Mediaview退出全屏模式时调用
void onExitFullscreen();
//广告开始跳转重定向时调用
void onStartRedirection(Campaign campaign, String url);
//广告完成跳转重定向后调用
void onFinishRedirection(Campaign campaign, String url);
//广告跳转重定向失败时调用
void onRedirectionFailed(Campaign campaign, String url);
//点击广告时调用
void onVideoAdClicked(Campaign campaign);
//广告展示时调用
void onVideoStart();
//广告视频完全播放完后调用
void onVideoComplete();
}
示例代码
Copy Map<String, Object> properties = MBNativeHandler.getNativeProperties("your placementId", "your unitId");
//期望获取的广告数量
properties.put(MBridgeConstans.PROPERTIES_AD_NUM, AD_NUM);
//如果想要获取原生广告视频时长,则至少添加如下两对Key之一
properties.put(MBridgeConstans.NATIVE_VIDEO_WIDTH, 720);
properties.put(MBridgeConstans.NATIVE_VIDEO_HEIGHT, 480);
//填写true即可
properties.put(NATIVE_VIDEO_SUPPORT, true);
mNativeHandle = new MBNativeHandler(properties, this);
mNativeHandle.setAdListener(new NativeAdListener() {
@Override
public void onAdLoaded(List<Campaign> campaigns, int template) {
if (campaigns != null && campaigns.size() > 0) {
Campaign mCampaign = campaigns.get(0);
int videoLength = mCampaign.getVideoLength();
final View view = LayoutInflater.from(NativeActivity.this)
.inflate(R.layout.mb_demo_mul_big_ad_content, null);
final ImageView iv = (ImageView) view.findViewById(R.id.mb_demo_iv_image);
final MBMediaView mbMediaView = (MBMediaView) view.findViewById(R.id.mb_mediaview);
MBAdChoice adChoice = view.findViewById(R.id.mb_mediaview_adchoice);
//建议根据campaign.getAdchoiceSizeHeight()和campaign.getAdchoiceSizeWidth()和campaign.adChoiceIconSize设置adChoice的大小
RelativeLayout.LayoutParams Params = (RelativeLayout.LayoutParams)view.getLayoutParams();
Params.height = campaign.getAdchoiceSizeHeight();
Params.width = campaign.getAdchoiceSizeWidth();
adChoice.setLayoutParams(Params);
adChoice.setCampaign(campaign);
mbMediaView.setNativeAd(mCampaign);
// 您可以使用自己的视图来显示ImageView,但是如果是视频,则必须使用MBMediaView来显示
if (!TextUtils.isEmpty(mCampaign.getImageUrl())) {
new ImageLoadTask(mCampaign.getImageUrl()) {
@Override
public void onRecived(Drawable result) {
iv.setImageDrawable(result);
mNativeHandle.registerView(view, mCampaign);
}
}.execute();
}
TextView tvAppName = (TextView) view.findViewById(R.id.mb_demo_bt_app_name);
tvAppName.setText(mCampaign.getAppName());
List<View> list = new ArrayList<View>();
list.add(view);
list.add(tvAppName);
mNativeHandle.registerView(tvAppName, list, mCampaign);
}
}
.
.
.
});
mNativeHandle.setTrackingListener(new NativeTrackingListener() {
@Override
public void onStartRedirection(Campaign campaign, String url) {
Log.e("pro", "onStartRedirection---");
}
@Override
public void onRedirectionFailed(Campaign campaign, String url) {
Log.e("pro", "onRedirectionFailed---");
}
@Override
public void onFinishRedirection(Campaign campaign, String url) {
Log.e("pro", "onFinishRedirection---"+url);
}
@Override
public void onDownloadStart(Campaign campaign) {
Log.e("pro", "start---");
}
@Override
public void onDownloadFinish(Campaign campaign) {
Log.e("pro", "finish---");
}
@Override
public void onDownloadProgress(int progress) {
Log.e("pro", "progress----" + progress);
}
@Override
public boolean onInterceptDefaultLoadingDialog() {
return false;
}
@Override
public void onShowLoading(Campaign campaign) {
}
@Override
public void onDismissLoading(Campaign campaign) {
}
});
自动渲染原生广告接入
Mintegral推出的自动渲染原生广告,集成比普通原生广告更加简单,开发者只需提供宽高区域,MB会自动展示与之契合的广告模板和素材。减少开发者对接成本的同时,更高效地利用MB算法输出广告创意,进而提升开发者收入水平。
广告效果示意:
初始化MBNativeAdvancedHandler
Copy public MBNativeAdvancedHandler(Activity activity, String placementId, String unitId)
设置NativeAdvancedAdListener
Copy public interface NativeAdvancedAdListener {
// 加载失败
void onLoadFailed(String msg);
// 广告资源加载成功且WebView渲染成功
void onLoadSuccessed();
// 展示成功
void onLogImpression();
// 点击广告
void onClick();
// 离开app
void onLeaveApp();
// 进入全屏 (只有走mraid协议的素材才会有这个回调)
void showFullScreen();
// 退出全屏 (只有走mraid协议的素材才会有这个回调)
void closeFullScreen();
// 关闭广告试图
void onClose();
}
其他设置
广告位大小设置
推荐: 320 x 250 比例
Copy mbNativeAdvancedHandler.setNativeViewSize(advancedNativeW,advancedNativeH);
静音设置
静音按钮仅在视频区域在上方的布局方案下才展示(具体比例根据适配规则而定)
Copy // 默认静音
mbNativeAdvancedHandler.setPlayMuteState(MBridgeConstans.REWARD_VIDEO_PLAY_MUTE);
关闭按钮展示设置
Copy /**
*
* @param 设置关闭按钮的状态
*/
mbNativeAdvancedHandler.setCloseButtonState(MBMultiStateEnum.positive);
播放规则设置
Copy public interface AutoPlayMode {
int PLAY_WHEN_NETWORK_IS_WIFI = 1;// wifi状态自动播放
int PLAY_WHEN_USER_CLICK = 2;// 默认不播放,点击后播放
int PLAY_WHEN_NETWORK_IS_AVAILABLE = 3;// 有网络即自动播放(默认)
}
mbNativeAdvancedHandler.autoLoopPlay(AutoPlayMode.PLAY_WHEN_NETWORK_IS_AVAILABLE);
H5布局设置
可以通过传入JSON,来自定义广告的展示布局 target可以选择:title、subTitle、button、icon、container、mediaContent
JSON格式举例如下:
Copy {
"list": [{
"target": "title",
"values": {
"paddingLeft": 15,
"backgroundColor": "yellow",
"fontSize": 15,
"fontFamily": "微软雅黑",
"color": "red"
}
}, {
"target": "mediaContent",
"values": {
"paddingTop": 10,
"paddingRight": 10,
"paddingBottom": 10,
"paddingLeft": 10
}
}]
}
加载广告
获取Request ID
SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到Mintegral
Copy /**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()
判断广告是否准备好播放
Copy public boolean isReady()
展示广告
获取广告试图
Copy mAdvancedNativeView = mbNativeAdvancedHandler.getAdViewGroup();
将广告试图添加到指定容器中
Copy container = findViewById(R.id.mb_demo_advanced_native_ac_container);
container.addView(mAdvancedNativeView);
通知SDK
Copy // 当系统的onResume被调用时候,必须要调用MBNativeAdvancedHandler的onResume方法
public void onResume()
// 当系统的onPause被调用时候,必须要调用MBNativeAdvancedHandler的onPause方法
public void onPause()
public void release()
释放MBNativeAdvancedHandler对象
在适当的时机调用release()方法来释放mbNativeAdvancedHandler对象的内存空间
Copy mbNativeAdvancedHandler.release();
示例代码
Copy mbNativeAdvancedHandler = new MBNativeAdvancedHandler(this,placementId, mUnitId);
mbNativeAdvancedHandler.setNativeViewSize(advancedNativeW,advancedNativeH);
mbNativeAdvancedHandler.setCloseButtonState(MBMultiStateEnum.positive);
mbNativeAdvancedHandler.setPlayMuteState(MBridgeConstans.REWARD_VIDEO_PLAY_MUTE);
mbNativeAdvancedHandler.autoLoopPlay(AutoPlayMode.PLAY_WHEN_NETWORK_IS_AVAILABLE);
String style = "{\n" +
"\t\"list\": [{\n" +
"\t\t\"target\": \"title\",\n" +
"\t\t\"values\": {\n" +
"\t\t\t\"paddingLeft\": 15,\n" +
"\t\t\t\"backgroundColor\": \"yellow\",\n" +
"\t\t\t\"fontSize\": 15,\n" +
"\t\t\t\"fontFamily\": \"微软雅黑\",\n" +
"\t\t\t\"color\": \"red\"\n" +
"\t\t}\n" +
"\t}, {\n" +
"\t\t\"target\": \"mediaContent\",\n" +
"\t\t\"values\": {\n" +
"\t\t\t\"paddingTop\": 10,\n" +
"\t\t\t\"paddingRight\": 10,\n" +
"\t\t\t\"paddingBottom\": 10,\n" +
"\t\t\t\"paddingLeft\": 10,\n" +
"\t\t}\n" +
"\t}]\n" +
"}";
JSONObject jsonObject = new JSONObject(style);
mbNativeAdvancedHandler.setViewElementStyle(jsonObject);
mAdvancedNativeView = mbNativeAdvancedHandler.getAdViewGroup();
mbNativeAdvancedHandler.setAdListener(new NativeAdvancedAdListener() {
@Override
public void onLoadSuccessed() {
Toast.makeText(NativeAdvancedShowActivity.this,"onLoadSuccessed:",Toast.LENGTH_LONG).show();
}
@Override
public void onLoadFailed(String msg) {
Toast.makeText(NativeAdvancedShowActivity.this,"onLoadFailed:" ,Toast.LENGTH_LONG).show();
}
@Override
public void onLogImpression() {
Toast.makeText(NativeAdvancedShowActivity.this,"onLogImpression:" ,Toast.LENGTH_LONG).show();
}
@Override
public void onClick() {
Toast.makeText(NativeAdvancedShowActivity.this,"onClick:" ,Toast.LENGTH_LONG).show();
}
@Override
public void onLeaveApp() {
Toast.makeText(NativeAdvancedShowActivity.this,"onLeaveApp:" ,Toast.LENGTH_LONG).show();
}
@Override
public void showFullScreen() {
Toast.makeText(NativeAdvancedShowActivity.this,"showFullScreen:" ,Toast.LENGTH_LONG).show();
}
@Override
public void closeFullScreen() {
Toast.makeText(NativeAdvancedShowActivity.this,"closeFullScreen:" ,Toast.LENGTH_LONG).show();
}
@Override
public void onClose() {
Toast.makeText(NativeAdvancedShowActivity.this,"onDismiss:" ,Toast.LENGTH_LONG).show();
}
}
private void show(){
if (mAdvancedNativeView != null && mAdvancedNativeView.getParent() == null) {
container.addView(mAdvancedNativeView);
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.mb_demo_advanced_native_ac_preload:
mbNativeAdvancedHandler.load();
break;
case R.id.mb_demo_advanced_native_ac_show:
show();
break;
case R.id.mb_demo_advanced_native_ac_release:
mbNativeAdvancedHandler.release();
break;
}
}
@Override
protected void onResume() {
super.onResume();
if(mbNativeAdvancedHandler != null){
mbNativeAdvancedHandler.onResume();
}
}
@Override
protected void onPause() {
super.onPause();
if(mbNativeAdvancedHandler != null){
mbNativeAdvancedHandler.onPause();
}
}
@Override
protected void onDestroy() {
if(mbNativeAdvancedHandler != null){
mbNativeAdvancedHandler.release();
}
super.onDestroy();
}
激励视频广告接入
激励视频是Mintegral平台效果非常好的广告形式,用户可以通过观看一段广告视频而获取奖励,由于广告视频素材非常具有创意和吸引力,因此会引起很多用户的兴趣,进而下载广告产品
广告效果示意:
硬件加速
在application节点下修改"android:hardwareAccelerated"的属性值:
Copy <application
...
android:hardwareAccelerated="true">
...
...
...
...
</application>
初始化MBRewardVideoHandler
Copy public MBRewardVideoHandler(Context context, String placementId, String unitId)
设置RewardVideoListener
注: 对于 void onAdClose(boolean isCompleteView, String rewardName, float rewardAmout) ,此方法里的 rewardName、rewardAmout 这两个参数是无意义的,且我们不会下发奖励。因此,你可以根据 isCompleteView 来决定是否给用户下发奖励。
Copy public interface RewardVideoListener {
/**
* 在广告加载完毕并可以展示时调用
* @param unitId
*/
void onVideoLoadSuccess(String placementId, String unitId);
/**
* 在广告加载完毕但不可以展示时调用
* @param unitId
*/
void onLoadSuccess(String placementId, String unitId);
/**
* 广告加载失败时调用
* @param 错误信息
*/
void onVideoLoadFail(String errorMsg);
/**
* 广告展示时调用
*/
void onAdShow();
/**
* 广告关闭时调用
* @param isCompleteView 如果为true,则表示已完全观看了视频
* @param rewardName 完全观看视频后的奖励名称
* @param rewardAmout 完全观看视频后的奖励金额
*/
void onAdClose(boolean isCompleteView, String rewardName, float rewardAmout);
/**
* 广告显示失败时调用
* @param 错误信息
*/
void onShowFail(String errorMsg);
/**
* 点击广告时调用
* @param unitId
*/
void onVideoAdClicked(String placementId, String unitId);
/**
* 广告播放结束后调用
* @param unitId
*/
void onVideoComplete(String placementId, String unitId);
/**
* 显示广告落地页时调用
* @param unitId
*/
void onEndcardShow(String placementId, String unitId);
静音设置
在调用load之前调用API
Copy //静音
mMBRewardVideoHandler.playVideoMute(MBridgeConstans.REWARD_VIDEO_PLAY_MUTE);
//默认非静音
mMBRewardVideoHandler.playVideoMute(MBridgeConstans.REWARD_VIDEO_PLAY_NOT_MUTE);
Reward Plus 设置
必须在load之前调用 该API仅表示接受投放Reward plus的广告,下发奖励依然依赖SDK中 onAdClose() 回调的奖励数量货币信息参数(RewardName,RewardAmout)进行奖励发放。
Copy public void setRewardPlus(boolean isRewardPlues)//在load之前调用,默认为false
//示例:
mMBRewardVideoHandler.setRewardPlus(true);
加载广告和展示广告
建议开发者在展示广告之前,提前进行广告加载(如初始化时或每次关闭广告后),进而给素材等资源的下载提供时间,减少用户在展示广告时等待的时间,提高用户体验和广告时间。调用以下方法来进行广告的加载和展示:
Copy public void load()
public void show(String rewardId)//rewardId默认传1就好
public void show(String rewardId, String userId) //userId在服务器回调中用到
获取Request ID
SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到Mintegral
Copy /**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()
判断广告是否准备好播放
通过该方法来判断视频素材已经可以达到播放状态,建议在可播放情况下才进行广告的展示。
Copy //检查广告是否准备好展示
public boolean isReady()
示例代码
Copy MBRewardVideoHandler mMBRewardVideoHandler = new MBRewardVideoHandler(this, "your placementId", "your unitId");
mMBRewardVideoHandler.setRewardVideoListener(new RewardVideoListener() {
@Override
public void onLoadSuccess(String placementId, String unitId) {
Log.e(TAG, "onLoadSuccess: " + (TextUtils.isEmpty(placementId) ? "" : placementId) + " " + unitId);
Toast.makeText(getApplicationContext(), "onLoadSuccess()", Toast.LENGTH_SHORT).show();
}
@Override
public void onVideoLoadSuccess(String placementId, String unitId) {
Log.e(TAG, "onVideoLoadSuccess: " + (TextUtils.isEmpty(placementId) ? "" : placementId) + " " + unitId);
Toast.makeText(getApplicationContext(), "onVideoLoadSuccess()", Toast.LENGTH_SHORT).show();
}
@Override
public void onVideoLoadFail(String errorMsg) {
Log.e(TAG, "onVideoLoadFail errorMsg:"+errorMsg);
Toast.makeText(getApplicationContext(), errorMsg, Toast.LENGTH_SHORT).show();
}
@Override
public void onShowFail(String errorMsg) {
Log.e(TAG, "onShowFail=" + errorMsg);
Toast.makeText(getApplicationContext(), "errorMsg:" + errorMsg, Toast.LENGTH_SHORT).show();
}
@Override
public void onAdShow() {
Log.e(TAG, "onAdShow");
Toast.makeText(getApplicationContext(), "onAdShow", Toast.LENGTH_SHORT).show();
}
@Override
public void onAdClose(boolean isCompleteView, String RewardName, float RewardAmout) {
Log.e(TAG, "onAdClose rewardinfo :" + "RewardName:" + RewardName + "RewardAmout:" + RewardAmout+" isCompleteView:"+isCompleteView);
if(isCompleteView){
Toast.makeText(getApplicationContext(),"onADClose:"+isCompleteView+",rName:"+RewardName +",RewardAmout:"+RewardAmout,Toast.LENGTH_SHORT).show();
showDialog(RewardName, RewardAmout);
}else{
Toast.makeText(getApplicationContext(),"onADClose:"+isCompleteView+",rName:"+RewardName +",RewardAmout:"+RewardAmout,Toast.LENGTH_SHORT).show();
}
}
@Override
public void onVideoAdClicked(String placementId, String unitId) {
Log.e(TAG, "onVideoAdClicked : " + (TextUtils.isEmpty(placementId) ? "" : placementId) + " " + unitId);
Toast.makeText(getApplicationContext(), "onVideoAdClicked", Toast.LENGTH_SHORT).show();
}
@Override
public void onVideoComplete(String placementId, String unitId) {
Log.e(TAG, "onVideoComplete : " + (TextUtils.isEmpty(placementId) ? "" : placementId) + " " + unitId);
Toast.makeText(getApplicationContext(), "onVideoComplete", Toast.LENGTH_SHORT).show();
}
@Override
public void onEndcardShow(String placementId, String unitId) {
Log.e(TAG, "onEndcardShow : " + (TextUtils.isEmpty(placementId) ? "" : placementId) + " " + unitId);
Toast.makeText(getApplicationContext(), "onEndcardShow", Toast.LENGTH_SHORT).show();
}
});
Copy public class TestActivity extends Activity implements View.OnClickListener{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
...
...
}
...
...
...
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_load:
mMBRewardVideoHandler.load();
break;
case R.id.bt_show:
if (mMBRewardVideoHandler.isReady()) {
mMBRewardVideoHandler.show("your rewardId", "your userId");
}
break;
}
}
}
设置服务端回调
您可以根据需要选择通过sdk或者服务端回调信息。若需要设置服务端回调,可以在后台添加callbackURL,Mintegral会在视频播放完成后调用callbackurl给予信息的回调。
1.创建广告位时设置回调方式
在用户完成任务之后,Mintegral服务器会向开发者服务器发送请求(callbackURL)来告知开发者服务器用户此次任务所获得的积分。对于开发者来说,服务端回调更加安全。
2.对于声明callbackUrl,只需要开发者修改域名部分
3.Mintegral Server获知到该user_id增加积分后,通过callback url通知开发者服务端。callback url附加的参数如下:
传输ID,Mintegral服务端生成,具有唯一性,
加密标识 MD5(user_id_reward_amount_trans_id_security_key)
4.开发者服务端一旦收到postback后,需给Mintegral服务端返回200或403。
Copy 200 means:User has been rewarded successfully.
403 means:abnormal
1.sign does not match
2.user_id does not exist
5.Mintegral Server发起Postback后,若超时(20秒)无响应,则在24小时内每隔5分钟重试一次。
插屏图片广告接入
插屏图片广告会在屏幕上展示一条大图广告,用户可以通过关闭按钮来关闭广告。
注:该广告类型仅对部分开发者提供,如有需要请联系您的AM或致信 developer@mintegral.com。此外,Mintegral推出了全新的InterstitialVideo广告类型,相比普通Interstitial广告会有更好的视觉效果和体验。
广告效果示意 :
创建MBInterstitialHandler对象
Copy public MBInterstitialHandler(Context context, Map<String, Object> params)
设置InterstitialListener
Copy public interface InterstitialListener {
/**
* 广告请求成功
*/
public void onInterstitialLoadSuccess();
/**
* 广告请求失败
* @param errorMsg 失败原因
*/
public void onInterstitialLoadFail(String errorMsg);
/**
* 成功展示插页式广告
*/
public void onInterstitialShowSuccess();
/**
* 展示插页式广告失败
* @param errorMsg 失败原因
*/
public void onInterstitialShowFail(String errorMsg);
/**
* 插页式广告关闭
*/
public void onInterstitialClosed();
/**
* 插页式广告点击
*/
public void onInterstitialAdClick();
}
加载广告和展示广告
Copy public void preload()//预加载
public void show()//展示
获取Request ID
SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到Mintegral
Copy /**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()
示例代码
Copy HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put(MBridgeConstans.PLACEMENT_ID, "your placementId");
hashMap.put(MBridgeConstans.PROPERTIES_UNIT_ID, "your unitId");
mInterstitialHandler = new MBInterstitialHandler(this, hashMap);
mInterstitialHandler.setInterstitialListener(new InterstitialListener() {
@Override
public void onInterstitialShowSuccess() {
Log.e(TAG, "onInterstitialShowSuccess");
}
@Override
public void onInterstitialShowFail(String errorMsg) {
Log.e(TAG, "onInterstitialShowFail errorMsg:" + errorMsg);
}
@Override
public void onInterstitialLoadSuccess() {
Log.e(TAG, "onInterstitialLoadSuccess");
Toast.makeText(getApplicationContext(), "onInterstitialLoadSuccess", Toast.LENGTH_SHORT).show();
}
@Override
public void onInterstitialLoadFail(String errorMsg) {
Log.e(TAG, "onInterstitialLoadFail errorMsg:" + errorMsg);
}
@Override
public void onInterstitialClosed() {
Log.e(TAG, "onInterstitialClosed");
}
@Override
public void onInterstitialAdClick() {
Log.e(TAG, "onInterstitialAdClick");
}
});
Copy public class TestActivity extends Activity implements View.OnClickListener{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
...
...
}
...
...
...
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_preload:
if (mInterstitialHandler != null) {
showLoadding();
mInterstitialHandler.preload();
}
break;
case R.id.bt_show:
if (mInterstitialHandler != null) {
mInterstitialHandler.show();
}
break;
}
}
}
插屏视频广告接入
插屏视频广告是插屏图片广告的升级版本,展示广告时会给用户展示一个全屏或半屏的视频,通过更有吸引力的视频提高用户的兴趣。
广告效果示意 :
创建MBInterstitialVideoHandler对象
Copy public MBInterstitialVideoHandler(Context context, String placementId, String unitId)
设置InterstitialVideoListenr
Copy public interface InterstitialVideoListenr {
/**
* 广告加载完成但无法播放时调用
* @param unitId
*/
void onLoadSuccess(String placementId, String unitId);
/**
* 在广告加载完毕并准备好播放时调用
* @param unitId
*/
void onVideoLoadSuccess(String placementId, String unitId);
/**
* 广告加载失败
* @param errorMsg 错误信息
*/
void onVideoLoadFail(String errorMsg);
/**
* 广告展示时调用
*/
void onAdShow();
/**
* 广告关闭时调用
* @param isCompleteView如果为true,则表示已完全观看了视频
*/
void onAdClose(boolean isCompleteView);
/**
* 广告播放失败
* @param errorMsg 错误信息
*/
void onShowFail(String errorMsg);
/**
* 广告点击时调用
* @param unitId
*/
void onVideoAdClicked(String placementId, String unitId);
/**
* 广告播放完成时调用
* @param unitId
*/
void onVideoComplete(String placementId, String unitId);
/**
* 如果开发人员设置了IV奖励,则在广告关闭时调用.
*
* @param isComplete 是否完全观看
* @param 奖励弹窗的出现时机状态
*/
void onAdCloseWithIVReward(boolean isComplete, int rewardAlertStatus);
/**
* 展示广告落地页时调用
* @param unitId
*/
void onEndcardShow(String placementId, String unitId);
}
静音设置
在调用load之前调用API
Copy //静音
mbInterstitalVideoHandler.playVideoMute(MBridgeConstans.REWARD_VIDEO_PLAY_MUTE);
//默认非静音
mbInterstitalVideoHandler.playVideoMute(MBridgeConstans.REWARD_VIDEO_PLAY_NOT_MUTE);
提示用户观看视频或试完完毕可获取奖励的弹窗的设置
在调用load之前调用API
Copy /**
* (可选)
* 调用此方法后,当视频/playable播放或者用户点击关闭按钮时,会弹出一个窗口,提示用户观看视频或试完完毕可获取奖励。
* 此方法接受两个参数。
*
* @param rewardType 表示弹窗的时机。
* 一共两个预设值可选。
* com.mbridge.msdk.MBridgeConstans#IVREWARD_TYPE_CLOSEMODE,此值表示当用户在点击关闭按钮时弹窗。
* com.mbridge.msdk.MBridgeConstans#IVREWARD_TYPE_PLAYMODE,此值表示在视频或playable播放过程中弹窗。
*
* @param value 预设定的值,此值可以选择传入整型或者浮点型的值。
* 当传入的值是整型时,代表具体秒数被设定,如播放视频多少秒后弹窗。默认为5秒,取值为在0~100之间的整数。
* 当传入的值是浮点型时,代表百分比值被设定,如播放视频百分之几后弹窗。默认为0.8,取值为0.0~1.0之间的小数。
*
* 根据第一个参数rewardType(弹窗的时机)不同,代表含义如下:
* 若弹窗时机为IVREWARD_TYPE_CLOSEMODE :表示在设定值value之前,当用户点击了关闭按钮后,会弹窗提示用户。若在设定值value之后,用户点击了关闭按钮也不会出弹窗。
* 若弹窗时机为IVREWARD_TYPE_PLAYMODE : 表示当视频或者playable播放到设定值value时,将主动弹窗提示用户。
*
*/
public void setIVRewardEnable(int rewardType, int value)//设置reward mode
public void setIVRewardEnable(int rewardType, double value)//设置reward mode
示例代码
Copy mbInterstitalVideoHandler.setIVRewardEnable(MBridgeConstans.IVREWARD_TYPE_CLOSEMODE, 30);
自定义奖励弹窗的展示内容
最好在调用load之前调用API
Copy /**
* (可选)
* 调用此方法可以设置奖励弹窗的文字信息。
*
* @param confirmTitle 弹窗中需要显示的标题文字。
* @param confirmContent 弹窗中需要显示的主题文字信息。
* @param cancelText 取消按钮的文字信息。
* @param confirmText 确认按钮的文字信息。
*
*/
public void setAlertDialogText(String confirmTitle, String confirmContent, String confirmText, String cancelText)//自定义奖励弹窗的展示内容
示例代码
Copy mbInterstitalVideoHandler.setAlertDialogText("Continue?", "If you continue, you can have reward when ad close.", "Continue", "Cancel");
加载广告和展示广告
Copy public void load()//加载广告
public void show()//展示广告
获取Request ID
SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到Mintegral
Copy /**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()
判断广告是否准备好播放
通过该方法来判断视频素材已经可以达到播放状态,建议在可播放情况下才进行广告的展示。
Copy //检查广告是否准备好播放
public boolean isReady()
示例代码
Copy MBInterstitialVideoHandler mbInterstitalVideoHandler = new MBInterstitialVideoHandler(this, "your placementId", "your unitid");
mbInterstitalVideoHandler.setInterstitialVideoListener(new InterstitialVideoListener() {
@Override
public void onLoadSuccess(String placementId, String unitId) {
Log.e(TAG, "onLoadSuccess:"+Thread.currentThread());
Toast.makeText(getApplicationContext(), "onLoadSuccess()", Toast.LENGTH_SHORT).show();
}
@Override
public void onVideoLoadSuccess(String placementId, String unitId) {
Log.e(TAG, "onVideoLoadSuccess:"+Thread.currentThread());
hideLoadding();
Toast.makeText(getApplicationContext(), "onVideoLoadSuccess()", Toast.LENGTH_SHORT).show();
}
@Override
public void onVideoLoadFail(String errorMsg) {
Log.e(TAG, "onVideoLoadFail errorMsg:"+errorMsg);
hideLoadding();
Toast.makeText(getApplicationContext(), errorMsg, Toast.LENGTH_SHORT).show();
}
@Override
public void onShowFail(String errorMsg) {
Log.e(TAG, "onShowFail=" + errorMsg);
Toast.makeText(getApplicationContext(), "errorMsg:" + errorMsg, Toast.LENGTH_SHORT).show();
}
@Override
public void onAdShow() {
Log.e(TAG, "onAdShow");
Toast.makeText(getApplicationContext(), "onAdShow", Toast.LENGTH_SHORT).show();
}
@Override
public void onAdClose(boolean isCompleteView) {
Log.e(TAG, "onAdClose rewardinfo :" + "isCompleteView:"+isCompleteView);
Toast.makeText(getApplicationContext(),"onADClose:"+isCompleteView,Toast.LENGTH_SHORT).show();
}
@Override
public void onVideoAdClicked(String placementId, String unitId) {
Log.e(TAG, "onVideoAdClicked");
Toast.makeText(getApplicationContext(), "onVideoAdClicked", Toast.LENGTH_SHORT).show();
}
@Override
public void onVideoComplete(String placementId, String unitId) {
Log.e(TAG,"onVideoComplete");
Toast.makeText(getApplicationContext(),"onVideoComplete",Toast.LENGTH_SHORT).show();
}
/**
* 如果您调用了MBInterstitialVideoHandler#setIVRewardEnable(int, int)这个函数
* 此回调将会响应.
* 您可以根据返回值决定是否给用户奖励.
*
* @param isComplete 此参数表示视频或可播放内容是否已完成播放.
*
* @param rewardAlertStatus非页内广告视频奖励提醒窗口状态.
* 此参数用于指示警报对话框的状态.
* 如果对话框没有展示, 它将返回{@link MBridgeConstans#IVREWARDALERT_STATUS_NOTSHOWN}
* 如果用户单击对话框的继续按钮,它将返回 {@link MBridgeConstans#IVREWARDALERT_STATUS_CLICKCONTINUE}
* 如果用户单击对话框的取消按钮,它将返回 {@link MBridgeConstans#IVREWARDALERT_STATUS_CLICKCANCEL}
*
*/
@Override
public void onAdCloseWithIVReward(boolean isComplete, int rewardAlertStatus) {
Log.e(TAG, "onAdCloseWithIVReward");
Log.e(TAG, isComplete ? "Video playback/playable is complete." : "Video playback/playable is not complete.");
if (rewardAlertStatus == MBridgeConstans.IVREWARDALERT_STATUS_NOTSHOWN) {
Log.e(TAG,"The dialog is not show.");
}
if (rewardAlertStatus == MBridgeConstans.IVREWARDALERT_STATUS_CLICKCONTINUE) {
Log.e(TAG,"The dialog's continue button clicked.");
}
if (rewardAlertStatus == MBridgeConstans.IVREWARDALERT_STATUS_CLICKCANCEL) {
Log.e(TAG,"The dialog's cancel button clicked.");
}
}
@Override
public void onEndcardShow(String placementId, String unitId) {
Log.e(TAG,"onEndcardShow");
Toast.makeText(getApplicationContext(),"onEndcardShow",Toast.LENGTH_SHORT).show();
}
});
Copy public class TestActivity extends Activity implements View.OnClickListener{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
...
...
}
...
...
...
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_load:
showLoadding();
if (mbInterstitalVideoHandler != null) {
/**
* 可选.
*
* 注意 : 请确保您在{@link MBInterstitialVideoHandler#load()}方法之前调用.
*
* 设置插页式视频的奖励模式.
*
* 如果希望IV具有奖励功能,请调用此方法.
* 或用户单击关闭按钮,
* a {@link android.app.AlertDialog} 将在设定的时间出现,
* 提醒用户观看或玩游戏可获得奖励.
*
* 当IV关闭时将被调用 {@link InterstitialVideoListener#onAdCloseWithIVReward(boolean, int)},
* 您可以根据该回调决定是否给予奖励.
*
* @param rewardType设置奖励弹框显示时间.
* {@link MBridgeConstans#IVREWARD_TYPE_CLOSEMODE} 当用户关闭视频或试玩广告时使用.
* {@link MBridgeConstans#IVREWARD_TYPE_PLAYMODE} 在播放视频几秒钟后获得奖励.
*
* @param value设置插页式视频奖励模式类型的值.
* 在PLAYMODE中,此值表示播放几秒钟后会出现{@link android.app.AlertDialog}.
* 在CLOSEMODE中,此值表示当用户在设置时间之前单击关闭按钮时,将显示{@link android.app.AlertDialog}.
*
* 你可以设定 {@link Integer} or {@link Double},
* 整数值表示秒,double值表示百分比.
* 整数值范围是0-100,双精度值范围是0.0-1.0.
* 默认值为5s或80%(0.8).
*/
mbInterstitalVideoHandler.setIVRewardEnable(MBridgeConstans.IVREWARD_TYPE_CLOSEMODE, 30);
/**
* 可选.
*
* 要自定义奖励提醒对话框显示文本时,请调用此方法.
*
* @param ConfirmTitle标题文本的奖励对话框.
* @param 确认对话框的confirmContent内容文本.
* @param cancelText取消奖励对话框的按钮文本.
* @param ConfirmText确认奖励对话框的按钮文字.
*/
mbInterstitalVideoHandler.setAlertDialogText("Continue?", "If you continue, you can have reward when ad close.", "Continue", "Cancel");
mbInterstitalVideoHandler.load();
}
break;
case R.id.bt_show:
if (mbInterstitalVideoHandler != null && mbInterstitalVideoHandler.isReady()) {
mbInterstitalVideoHandler.show();
}
break;
case R.id.bt_mute:
if (mbInterstitalVideoHandler != null) {
Toast.makeText(getApplicationContext(),"bt_mute",Toast.LENGTH_SHORT).show();
mbInterstitalVideoHandler.playVideoMute(MBridgeConstans.REWARD_VIDEO_PLAY_MUTE);
}
break;
case R.id.bt_unmute:
if (mbInterstitalVideoHandler != null) {
Toast.makeText(getApplicationContext(),"bt_unmute",Toast.LENGTH_SHORT).show();
mbInterstitalVideoHandler.playVideoMute(MBridgeConstans.REWARD_VIDEO_PLAY_NOT_MUTE);
}
break;
}
}
}
交互式广告接入
交互式广告是Mintegral推出的全新广告形态,通过该形式用户可以实际参与一个精心设计的交互广告(比如试玩一个游戏Demo),进而大大提升转化效果。当前广告内容以Playable为主。
注:该广告类型仅对部分开发者提供,如有需要请联系您的AM或致信developer@mintegral.com
广告效果示意:
创建MBInteractiveHandler对象
Copy public MBInteractiveHandler(Context context, Map<String, Object> params)
设置InteractiveAdsListener
Copy public interface InteractiveAdsListener {
/**
* 广告加载成功
* @param restype
*/
void onInteractivelLoadSuccess(int restype);
/**
* 资源加载成功
*/
void onInterActiveMaterialLoadSuccess();
/**
* 广告加载失败
* @param errorMsg
*/
void onInteractiveLoadFail(String errorMsg);
/**
* 广告展示成功
*/
void onInteractiveShowSuccess();
/**
* 试玩广告播放失败
* @param errorMsg
*/
void onInteractiveShowFail(String errorMsg);
/**
* 广告关闭
*/
void onInteractiveClosed();
/**
* 广告点击
*/
void onInteractiveAdClick();
/**
* 当交互式广告成功显示并可以播放时调用
* @isComplete 表示互动广告能否完全播放
*/
void onInteractivePlayingComplete(boolean isComplete);
}
加载广告和展示广告
建议开发者在展示广告之前,提前进行广告加载(如初始化时或每次关闭广告后),进而给素材等资源的下载提供时间,减少用户在展示广告时等待的时间,提高用户体验和广告时间。调用以下方法进行广告的加载和展示:
Copy public void load()//加载广告
public void show()//展示广告
获取Request ID
SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到Mintegral
Copy /**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()
示例代码
Copy HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put(MBridgeConstans.PLACEMENT_ID, "your placementId");
hashMap.put(MBridgeConstans.PROPERTIES_UNIT_ID, "your unitid");
mbInteractiveHandler = new MBInteractiveHandler(this, hashMap);
mbInteractiveHandler.setInteractiveAdsListener(new InteractiveAdsListener() {
@Override
public void onInteractivelLoadSuccess(int restype) {
Log.e(TAG, "onInteractivelLoadSuccess");
Toast.makeText(getApplicationContext(), "onInteractivelLoadSuccess()", Toast.LENGTH_SHORT).show();
}
@Override
public void onInterActiveMaterialLoadSuccess() {
Toast.makeText(getApplicationContext(), "onInterActiveMaterialloadSuccess()", Toast.LENGTH_SHORT).show();
}
@Override
public void onInteractiveLoadFail(String errorMsg) {
Log.e(TAG, "onInteractiveLoadFail");
Toast.makeText(getApplicationContext(), "onInteractiveLoadFail()"+errorMsg, Toast.LENGTH_SHORT).show();
}
@Override
public void onInteractiveShowSuccess() {
Log.e(TAG, "onInteractiveShowSuccess");
Toast.makeText(getApplicationContext(), "onInteractiveShowSuccess()", Toast.LENGTH_SHORT).show();
}
@Override
public void onInteractiveShowFail(String errorMsg) {
Log.e(TAG, "onInteractiveShowFail " + errorMsg);
Toast.makeText(getApplicationContext(), "onInteractiveShowFail()", Toast.LENGTH_SHORT).show();
}
@Override
public void onInteractiveClosed() {
Log.e(TAG, "onInteractiveClosed");
}
@Override
public void onInteractiveAdClick() {
Log.e(TAG, "onInteractiveAdClick");
}
});
Copy public class TestActivity extends Activity implements View.OnClickListener{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
...
...
}
...
...
...
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_load:
if (mbInteractiveHandler != null) {
showLoadding();
mbInteractiveHandler.load();
}
break;
case R.id.bt_show:
if (mbInteractiveHandler != null) {
mbInteractiveHandler.show();
}
break;
}
}
}
开屏广告接入
开屏式广告是目前比较流行的广告形式之一。这种类型比较适合投放电商、品牌类广告,流量接入上也很适合接入应用类流量。用户可以点击广告跳转到广告落地页,或者点击右上角的“跳过”按钮,跳转到app内容首页。开屏广告会在您的应用开启时加载,展示完毕后自动关闭并进入您的应用主界面。
分类 :开屏广告分为半屏和全屏,在半屏情况下,支持定义logo图片,同时也支持横竖屏。
广告效果示意:
配置Androidmanifest.xml文件
需要在相应的activity里加上如下配置:
Copy android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="false"
android:screenOrientation="竖屏或者横屏"
其中screenOrientation可以自定义
创建MBSplashHandler对象
Copy /**
* @param placementId placementId
* @param unitId ad unit
*/
public MBSplashHandler(String placementId, String unitId)
/**
* @param placementId placementId
* @param unitId ad unit
* @param canSkip 是否允许用户跳过启动广告
* @param countDownS 广告播放的时间。 必须在2-10秒内
*/
public MBSplashHandler(String placementId, String unitId, boolean canSkip, int countDownS)
/**
* @param placementId placementId
* @param unitId ad unit
* @param 是否允许用户跳过启动广告
* @param countDownS 广告播放的时间。 必须在2-10秒内
* @param orientation 广告展示时的屏幕方向
* @param logoSizeH logo 高度
* @param logoSizeW logo 宽度
*/
public MBSplashHandler(String placementId, String unitId, boolean canSkip, int countDownS, int orientation, int logoSizeH, int logoSizeW)
设置加载超时时间(可选)
loadTimeOutMs:SDK在指定时间内没有完成广告加载(即加载超时),则直接关闭。单位是s。
Copy public void setLoadTimeOut(long loadTimeOutS)
其他设置
设置logo的size、设置方向。
注: 1. LogoView的size不能超过屏幕的 0.25 2. orientation默认是竖屏
Copy public void setLogoView(View bottomView,int width,int height)
/**
* @param orientation 方向可以选择如下
* Configuration.ORIENTATION_PORTRAIT
* Configuration.ORIENTATION_LANDSCAPE
*/
public void setOrientation(int orientation)
设置MBSplashLoadListener
Copy public interface MBSplashLoadListener {
void onLoadSuccessed(int reqType);
void onLoadFailed(String msg,int reqType);
}
注: reqType为1,表示preLoad的回调;2表示loadAndShow的回调
设置MBSplashShowListener
Copy public interface MBSplashShowListener {
/**
*广告展示成功
*/
void onShowSuccessed();
/**
*广告展示失败
* @param msg
*/
void onShowFailed(String msg);
/**
*广告点击
*/
void onAdClicked();
/**
* 开屏页面关闭
* @param type 开屏页面关闭的方式:1 是用户点击跳过;2 是倒计时结束 3 点击广告后跳出app
*/
void onDismiss(int type);
/**
* 倒计时回调
* @param millisUntilFinished 距离倒计时结束的时间,单位ms
*/
void onAdTick(long millisUntilFinished);
}
加载广告和展示广告
我们提供两种请求展示广告方式:
先预请求广告,再在合适的时机去展示广告
Copy public void preLoad()
public void show( ViewGroup container)// container:承载广告的容器
实时请求并展示广告
Copy public void loadAndShow( ViewGroup container)
获取Request ID
SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到Mintegral
Copy /**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()
判断广告是否准备好播放
通过该方法来判断视频素材已经可以达到播放状态,建议在可播放情况下才进行广告的展示。
Copy public boolean isReady()
注:建议在合适的时机preload,生命周期内preload时机最好不要距离show时间过长,建议不超过30分钟,调用preload后,在show场景时可以通过isready判断,如果ready则调用show。如果不ready可以调用 load&show。
通知SDK
Copy public void onResume()//通知我们页面可以显示出来
public void onPause()//通知我们页面可以被隐藏
public void onDestroy()//通知我们销毁资源
示例代码
Copy mbSplashHandler = new MBSplashHandler("your placementId", mUnitId);
mbSplashHandler.setLoadTimeOut(loadTimeOut);
Button textView = new Button(this);
textView.setText("logo");
mbSplashHandler.setLogoView(textView, 100, 100);
mbSplashHandler.setSplashLoadListener(new MBSplashLoadListener() {
@Override
public void onLoadSuccessed(int reqType) {
Log.e(TAG, "onLoadSuccessed" + reqType);
Toast.makeText(SplashActivity.this,"onLoadSuccessed:" + reqType,Toast.LENGTH_LONG).show();
}
@Override
public void onLoadFailed(String msg, int reqType) {
Log.e(TAG, "onLoadFailed" + msg + reqType);
Toast.makeText(SplashActivity.this,"onLoadFailed:" + reqType,Toast.LENGTH_LONG).show();
}
});
mbSplashHandler.setSplashShowListener(new MBSplashShowListener() {
@Override
public void onShowSuccessed() {
Log.e(TAG, "onShowSuccessed");
}
@Override
public void onShowFailed(String msg) {
Log.e(TAG, "onShowFailed" + msg);
}
@Override
public void onAdClicked() {
Log.e(TAG, "onAdClicked");
}
@Override
public void onDismiss(int type) {
Log.e(TAG, "onDismiss" + type);
finish();
}
@Override
public void onAdTick(long millisUntilFinished) {
Log.e(TAG, "onAdTick" + millisUntilFinished);
}
});
public void onClick(View v) {
switch (v.getId()) {
case R.id.mb_demo_splash_ac_load_show:
mbSplashHandler.loadAndShow(container);
break;
case R.id.mb_demo_splash_ac_preload:
mbSplashHandler.preLoad();
break;
case R.id.mb_demo_splash_ac_show:
if (mbSplashHandler.isReady()) {
mbSplashHandler.show(container);
} else {
Log.e(TAG, "isready is false");
}
break;
}
}
@Override
protected void onResume() {
super.onResume();
if(mbSplashHandler != null){
mbSplashHandler.onResume();
}
}
@Override
protected void onPause() {
super.onPause();
if(mbSplashHandler != null){
mbSplashHandler.onPause();
}
}
@Override
protected void onDestroy() {
if(mbSplashHandler != null){
mbSplashHandler.onDestroy();
}
super.onDestroy();
}
Test ID
您在测试期间所获取的广告均为Mintegral的正式广告,因此会受到算法智能优化的影响,如果测试期间经常load失败,返回EXCEPTION_RETURN_EMPTY,可使用以下测试id进行测试。
7c22942b749fe6a6e361b675e96b3ee9
集成建议&常见问题
集成建议
1.在Application中初始化SDK。
2.在load成功后的onAdLoaded中进行preload, 保证广告的展示速度,这样才能获取更好的收益。
3.register时一定要对ViewGroup,不要只对Button, 保证广告的可点击区域,这个对收益影响很大。
4.广告展示布局的CTA按钮可以用TextView, 如果用Button会拦截事件。
5.一个广告位对应一个MBNativeHandler, 保证每个广告位的唯一性。
6.在APP首页进行墙的预加载。
7.如果想监听墙入口的事件,可以在墙入口ViewGroup设置onTouch事件。
常见问题
1.返回的广告为什么有的是中文,但是手机设置是英文?
答:广告内容和手机设定的语言无关,会与用户的网络IP有关
2.为什么广告第一次跳转很慢?
答:广告会经过多层302跳转,拿到最终链接进行跳转,NativeHandler可以接收到广告的跳转的结束,开发者可以在这个时间段设置Loading对话框
接口状态返回说明
没有广告填充,可能导致的原因:1.您在测试期间所获取的广告均为Mintegral的正式广告,因此会受到算法智能优化的影响,若一段时间内大量加载和展示广告,可能导致一段时间后没有广告填充的现象。2.应用是上架Google Play的,但测试的网络状态是中国大陆网络。3.后台创建没有添加包名。4.后台将黑名单当做白名单,黑名单是选择你不想要投放的广告分类,请勿全选。
appID和appKey不匹配,解决方案:检查APPkey和APPID是否填写正确,APPkey可以在应用设置(APP Setting)模块顶部获取
EXCEPTION_UNIT_NOT_FOUND_IN_APP
EXCEPTION_UNIT_ADTYPE_ERROR
EXCEPTION_IV_RECALLNET_INVALIDATE
请求时的网络状态不对,一般是SDK初始化还未完成就去请求导致的
EXCEPTION_SERVICE_REQUEST_OS_VERSION_REQUIRED
无法取得osVersion,一般是GDPR开关导致的
data load failed, errorMsg is No video campaign
load失败,返回的compaign 没有带视频素材。
可能原因:
1. 当前广告单子对应的app已经安装
2. 服务器端返回的offer没有video_url
data load failed, errorMsg is load no ad
data load failed, errorMsg is Network error,please check
网络状态为不可用
可能原因:
1. 请求API 结束后,获取网络状态为不可用
2. 请求API结束后,拿到的API http 的resp为空
视频文件无效
可能原因:
1. 视频文件是否存在
2. 视频文件是一个文件,不是文件夹
3. 视频文件可读
1. 视频文件内容md5与服务端下发的不匹配
2. 客户端生成Md5异常
data load failed, errorMsg is The server returns an exception
1. 服务端返回的code 非 200/206
2. code OK的情况下 body 为空
EXCEPTION_FILTER_BY_PLACEMENTID_INCONSISTENT
EXCEPTION_UNIT_BIDDING_TYPE_ERROR
bidding type错误,只能重新创建unitID
欧盟GDPR版本须知:
接口介绍
1.设置是否获取用户信息的开关,此方法需要在SDK初始化之前调用
Copy void setConsentStatus(Context context,int status);
示例代码:
Copy MBridgeSDK sdk = MBridgeSDKFactory.getMBridgeSDK();
Map<String, String> map = sdk.getMBConfigurationMap("your appId", "your appKey");
sdk.setConsentStatus(MainApplication.this, MBridgeConstans.IS_SWITCH_ON);
sdk.init(map, MainApplication.this);
注意事项
如果不收集用户信息,将会影响广告投放,可能会引起没有广告返回的情况 ,请知悉。
对于欧盟用户,开发者集成时,建议在征得用户同意之前,先不要初始化SDK ,以免引起不必要的麻烦。
CCPA准备:
2018年6月28日,美国加利福尼亚州(“加州”)颁布了《2018年加州消费者隐私法案》("CCPA"),旨在加强消费者隐私权和数据安全保护,将于2020年1月1日生效。对于加州用户,您可以基于用户的选择通过setDoNotTrackStatus接口进行设置。设置完成后,Mintegral将不再基于用户设备信息向该用户展示个性化推荐广告,也不会将该用户设备信息同步至其他第三方合作伙伴。该API在SDK版本12.1.2及以上已经提供。
接口介绍
设置是否获取用户信息的开关,调用此方法时,要保证已经调用了SDK初始化
Copy /**
* If set to TRUE, the server will not display personalized ads based on the user's personal information.
* When receiving the user's request, and will not synchronize the user's information to other third-party partners.
* Default is FALSE.
* @param status
*/
void setDoNotTrackStatus(boolean status);
示例代码
Copy MBridgeSDK sdk = MBridgeSDKFactory.getMBridgeSDK();
Map<String, String> map = sdk.getMBConfigurationMap("your AppId", "your AppKey");
sdk.init(map, MainApplication.this);
sdk.setDoNotTrackStatus(false);
ChangeLog
1、增加广告load阶段sdk堆栈信息上报
2、若干bug修复
1、apk下载合规
2、弹窗页面支持动态native
1、视频播放器更新为ExoPlayer
2、边下边播不再依赖开发者配置
3、国内版本下载器优化
4、性能优化,若干bug修复
1、优化APK的下载
2、恢复、优化setting campaign上报
3、移除load阶段deeplink的逻辑判断
4、性能优化
1、适配AndroidX
2、性能优化
3、修复若干Bug
1、适配AndroidX
2、修复某些情况视频播放失败的问题
3、修复RV/IV中Excludelds没有上报的问题
1、适配AndroidX
2、针对Android异形屏适配
3、v3接口升级优化
4、修复因混淆导致的新下载模块可能失效的问题
1、适配AndroidX
2、删除JS有关的字符串
3、删除与电量相关的API
1、适配AndroidX
2、优化SDK的Demo
3、优化更改SDK的用户数据参数
4、性能优化
1、适配AndroidX
2、修复一些问题,优化性能
1、适配AndroidX
2、优化deeplink
3、移除user data上报
1、适配AndroidX
2、修复一些问题,优化性能
1、适配AndroidX
2、新增广告Id获取
3、新增下载二次弹窗确认逻辑
4、修复一些问题
1、适配AndroidX
2、新增Reward Plus
3、优化性能
1、适配AndroidX
2、NativeVideo新增播放完成回调和视频时长属性
3、优化性能
4、修复一些问题
1、适配AndroidX
2、优化性能
3、修复一些问题
1、适配AndroidX
2、将在SDK中的网络安全配置交给开发者配置
3、修复一些问题
1、适配AndroidX
2、优化性能
3、修复一些问题
1、适配AndroidX
2、优化性能
3、修复一些问题
1、适配AndroidX
2、新增SDK初始化成功和失败的回调
1、适配AndroidX
2、新增自动渲染原生广告样式
3、修复一些问题
1、适配AndroidX
2、修复一些问题
3、优化性能
1、适配AndroidX
2、所有广告类型初始化时增加placementId
3、修复一些问题
1、适配AndroidX
2、优化 load 流程:减少 timeout 出现的情况和优化触发多次 load 时给开发者回调的问题
3、修复一些问题
1、适配AndroidX
2、修复开屏展示上报问题
1、适配AndroidX
2、修复sdk在check isready 时候在弱网情况下引发的load超时问题
3、删除 runtime 的高风险代码
1、适配AndroidX
2、新增开屏广告样式
3、适配中英文下载进度条
4、修复已知bug
1、适配AndroidX
2、修复可能导致NativeVideo无法正常播放的问题
1、适配AndroidX
2、新增 IV 试玩弹窗、奖励弹窗设置等
3、RV & IV 静音设置优化,播放时以开发者的设置为准
4、内部优化
1、适配AndroidX
2、新增banner的关闭回调
1、适配AndroidX
2、新增支持智能下载
3、修复aa类无法找到问题
1、适配AndroidX
2、修复判定BannerView展示失败的问题
1、适配AndroidX
2、修复bitmap异常
3、内部优化
1、适配AndroidX
2、修改判断BannerView被遮盖的判定条件
3、修复BannerView被放置于可滑动组件中时,可能出现的自动刷新及点击异常
4、修复可能造成NativeVideo展示回调异常的问题。
1、未适配AndroidX
2、修复一些问题,优化性能
1、未适配AndroidX
2、修复一些问题,优化性能
1、未适配AndroidX
2、修复4.4及以下版本兼容问题
1、未适配AndroidX
2、新增广告Id获取
3、新增下载二次弹窗确认逻辑
4、修复一些问题
1、未适配AndroidX
2、新增Reward Plus
3、优化性能
1、未适配AndroidX
2、NativeVideo新增播放完成回调和视频时长属性
3、优化性能
4、修复一些问题
1、未适配AndroidX
2、将在SDK中的网络安全配置交给开发者配置
3、修复一些问题
1、未适配AndroidX
2、新增SDK初始化成功和失败的回调
3、优化性能
4、修复一些问题
1、未适配AndroidX
2、新增自动渲染原生广告样式和开屏广告样式
3、修复一些问题
1、未适配AndroidX
2、修复Setting无法获取时可能导致的Offer过期判定失误的问题
3、修复NativeVideo二跳页在特定场景顶部可能出现白条的问题
1、未适配AndroidX
2、新增banner的关闭回调
1、未适配AndroidX
2、新增支持智能下载
3、修复aa类无法找到问题
1、未适配AndroidX
2、修复判定BannerView展示失败的问题
1、未适配AndroidX
2、修改判断BannerView被遮盖的判定条件
3、修复BannerView被放置于可滑动组件中时,可能出现的自动刷新及点击异常
4、修复可能造成NativeVideo展示回调异常的问题
1、未适配AndroidX
2、开发者书旗反馈小米Mix3 退后台视频播放失败问题修复
3、Banner回调两次问题修复
4、开发者反馈华为oaid aidl文件混淆与不混淆冲突问题修复
5、修复MBActivity有可能导致的Crash
6、修复MBCommonActivity有可能导致的崩溃
1、支持om测试 2、Mraid expand支持 3、Banner回调优化