Integration for Android SDK_CN - Mintegral

Android开发文档

通知自12.0.0版本起,已经支持AndroidX。

概要

本文档描述了Android开发者如何集成Mintegral SDK产品,通过集成Mintegral sdk 展示广告创造收益。
Mintegral SDK提供了9种广告形式,包括:Banner(横幅广告)、Native(原生广告)、NativeVideo(原生视频)、Automatic Rending Native(自动渲染原生广告)、RewardVideo(激励性视频)、Interstitial(插屏)、Interstitial Video(插屏视频)、InterActive(试玩广告)、Splash(开屏广告)。

集成前准备

获取账户信息

App Key

开发者每个账号都有对应的App Key,请求广告时需要用到该参数,它可以从Mintegral开发者后台获取,在APP Setting -> App Key界面,可以查看到该账号的App Key,如图所示:

App Id

开发者每创建一个应用后,系统会自动生成App Id,可在APP Setting -> App Id界面查看到已创建的应用以及对应的App Id,如图所示:

Placements & Units

开发者每创建一个广告版位后,系统会自动生成Placement ID,可在APP Setting -> Placement Management -> Edit Placement & Unit界面添加或修改该广告版位的Unit Id,如图所示:

虚拟货币概念

MTG平台为开发者提供管理部分虚拟货币的能力,使存在内部货币机制的产品可以运用自己的虚拟货币更好地激励用户。

后台增加“虚拟货币”管理模块,用于管理开发者的虚拟货币信息(Reward Info),Reward info设置信息可以与各种奖励性广告类型Placement ID进行同步,方便开发者管理自己的虚拟货币。

创建虚拟货币
在后台右侧菜单栏中找到虚拟货币,进行创建。

新建货币类型

配置虚拟货币
在Placement下配置虚拟货币

获取SDK

请根据以下提示选择您的集成方式,点击“开始集成”获取SDK

Demo

在手动下载SDK的zip包里,名称为MTGTest的是此下载版本对应的Demo

获取SDK版本号

MTGConfiguration.SDK_VERSION

注意:自12.0.0版本起,已经支持AndroidX;如果您的项目没有适配AndroidX,只能使用10.x.x版本。

注意:如果使用gradle方式拉取代码失败,在项目根build.gradle文件中添加maven仓库配置。

 //非上架GP市场应用 安卓X版本
 maven {
        url "https://dl.bintray.com/mintegral-official/Andorid_ad_SDK_for_china"
 }

 //非上架GP市场应用 非安卓X版本
 maven {
        url  "https://dl.bintray.com/mintegral-official/Andorid_ad_SDK_for_china_support"
 }

 //上架GP市场应用 安卓X版本
 maven {
        url  "https://dl.bintray.com/mintegral-official/mintegral_ad_sdk_android_for_oversea"
 }

截图展示:

AndroidManifest.xml 配置

1.必要权限

注:如果使用了国内流量版SDK ,“READ_PHONE_STATE”此条权限必须加上,如果是Android系统6.0以上,需要动态申请此权限。

<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.下载器适配

(1)将Android Support v4包升级到26.0.0或以上。

(2)如果targetSDKVersion >= 24,需要适配FileProvider。 国内流量版本必需,海外版本可以不添加。
在xml文件下添加mtg_provider_paths.xml

<?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文件中添加如下代码

//国内流量版本必需,海外版本可以不添加。
<provider
        android:name="com.mintegral.msdk.base.utils.MTGFileProvider"
        android:authorities="${applicationId}.mtgFileProvider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/mtg_provider_paths"/>
</provider>

4.混淆配置

(1)AndroidX的混淆配置

-keepattributes Signature   
-keepattributes *Annotation*   
-keep class com.mintegral.** {*; }  
-keep interface com.mintegral.** {*; }  
-keep interface androidx.** { *; }
-keep class androidx.** { *; }
-keep public class * extends androidx.** { *; }
-dontwarn com.mintegral.**   
-keep class **.R$* { public static final int mintegral*; }


(2)非AndroidX的混淆配置

-keepattributes Signature   
-keepattributes *Annotation*   
-keep class com.mintegral.** {*; }  
-keep interface com.mintegral.** {*; }  
-keep class android.support.v4.** { *; }  
-dontwarn com.mintegral.**   
-keep class **.R$* { public static final int mintegral*; }

5.资源缩减配置

如果开启了shrinkResources,需要进行以下配置:

新增res/raw/keep.xml文件,添加如下内容:

<?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:tools="http://schemas.android.com/tools"
        tools:keep="@drawable/mintegral*,@drawable-hdpi-v4/mintegral*,@drawable-hdpi/mintegral*,@layout/mintegral*,@values/mintegral*,@anim/mintegral*" />

6.资源混淆白名单配置

如果使用了AndResGuard工具,需要进行以下配置:

"R.string.mintegral*",
"R.layout.mintegral*",
"R.drawable.mintegral*",
"R.anim.mintegral*",
"R.color.mintegral*",
"R.style.mintegral*",
"R.id.mintegral*"

7.智能下载配置

Note:开启智能下载的功能,即“边下边播”,将有益于广告load的成功率

对于AndroidX,在14.2.5版本及以后,如果在Android9.0及以上要开启此功能,需要进行配置

对于非AndroidX,在10.5.0版本及以后,如果在Android9.0及以上要开启此功能,需要进行配置

配置方法:

(1)在res目录下,创建network_security_config.xml文件,内容如下:

<?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标签,增加如下配置:

android:networkSecurityConfig="@xml/network_security_config"

SDK初始化

作为集成的第一步,你需要先将Mintegral的SDK进行初始化。

将Mintegral SDK添加至您的项目

通过JAR/AAR包集成

包名 作用
mintegral_common.jar/aar
mintegral_chinacommon.jar/aar
公共基础包
mintegral_mtgbanner.aar.jar/aar Banner广告功能包
mintegral_mtgnative.jar/aar Native广告功能包
mintegral_nativeex.jar/aar NativeVideo广告功能包
mintegral_mtgnativeadvanced.jar/aar AutomaticRendingNative广告功能包
mintegral_reward.jar/aar RewardVideo广告功能包
mintegral_interstitial.jar/aar Interstitial广告功能包
mintegral_interactiveads.jar/aar Interactive广告功能包
mintegral_mtgsplash.jar/aar Splash广告功能包
mintegral_mtgdownloads.jar/aar 下载部分的功能包,只针对非上架google play的开发者提供
mintegral_playercommon.jar/aar 视频播放器基础包
mintegral_videojs.jar/aar 视频播放器功能包
mintegral_videocommon.jar/aar 视频下载部分的功能包
mintegral_videofeeds.jar/aar 信息流视频的功能包
mintegral_mtgjscommon.jar/aar java 和 h5 交互的包

Tips:mintegral_common.aar/mintegral_chinacommon.aar是公共基础包,是每种广告形式都必须要添加的,
如果要实现某种功能,必须要添加对应的aar包。例如要集成的是Splash形式的广告,需要放mintegral_common.aar/mintegral_chinacommon.aar、mintegral_splash.aar。
如果是jar包集成的话除了将jar包添加之外,还需要将它对应的res文件导入项目。

初始化

1.在application里的如下方法中调用初始化方法,传入在Mintergal后台得到的AppID和AppKey。建议在主线程调用此方法,并且尽量在你应用启动时,越早初始化SDK越好。保证SDK在应用程序中只初始化一次,可以参考Demo中的MintegralSDKManager.java工具类

我们提供两种初始化SDK的方式:

(1)不带回调的初始化

public void init(Map<String,String> ids,Application application);

示例代码:

MIntegralSDK sdk = MIntegralSDKFactory.getMIntegralSDK();
Map<String, String> map = sdk.getMTGConfigurationMap("your AppId", "your AppKey");
sdk.init(map, this);

(2)带回调的初始化

注:

​ AndroidX:14.1.0及以上版本,SDK提供初始化状态的回调

​ 非AndroidX:10.4.0及以上版本,SDK提供初始化状态的回调

public void init(Map<String,String> ids, Application application, SDKInitStatusListener listener);

示例代码:

MIntegralSDK sdk = MIntegralSDKFactory.getMIntegralSDK();
Map<String, String> map = sdk.getMTGConfigurationMap("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初始化的时候调用以下代码来进行预加载,提高你的广告加载效率。示例代码如下:


MIntegralSDK sdk = MIntegralSDKFactory.getMIntegralSDK();
Map<String, Object> preloadMap = new HashMap<String, Object>();
preloadMap.put(MIntegralConstans.PROPERTIES_LAYOUT_TYPE, MIntegralConstans.LAYOUT_NATIVE);//设置广告形式为native
preloadMap.put(MIntegralConstans.PROPERTIES_UNIT_ID,"your unitId");
preloadMap.put(MIntegralConstans.PROPERTIES_AD_NUM, 1);
preloadMap.put(MIntegralConstans.PLACEMENT_ID, "your placementId");
sdk.preload(preloadMap);    

横幅广告接入

横幅广告是移动广告最传统的广告类型,易于实现,用户接受度高,对于超休闲游戏和工具类产品是一种很好的变现形式。

广告效果示意:

初始化MTGBannerView

在xml中加入MTGBannerView,或动态加载MTGBannerView。
注意:动态加载MTGBannerView时,SDK不会控制View的大小,所以需要setLayoutParams给view设定宽高。

Example:


mtgBannerView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));

定义MTGBannerView,如下代码:


public MTGBannerView(Context context){
    this(context,null);
}

public void init(BannerSize bannerSize, String placementId, String unitId);

BannerSize 介绍:


/**
 * sizeType
 */

//Represents the fixed banner ad size - 320pt by 90pt.       
public static final int LARGE_TYPE = 1;

//Represents the fixed banner ad size - 300pt by 250pt.            
public static final int MEDIUM_TYPE = 2; 

//if device height <=720,Represents the fixed banner ad size - 320pt by 50pt;
if device height > 720,Represents the fixed banner ad size - 728pt by 90pt.         
public static final int SMART_TYPE = 3;  

//Represents the fixed banner ad size - 320pt by 50pt.        
public static final int STANDARD_TYPE = 4;   

//Customize the size according to your needs.           
public static final int DEV_SET_TYPE = 5;

/**
 * @param sizeType 
 * @param showWidth Set your need Width
 * @param showHeight Set your need Height
 */
public BannerSize(int sizeType,int showWidth,int showHeight);

MTGBannerView功能API介绍

/**
 * @param allowShowCloseBtn can show close botton.
 */
public void setAllowShowCloseBtn(boolean allowShowCloseBtn)

/**
 Automatic refresh time, in seconds, is set in the range of 10s~180s.
 If set to 0, it will not be automatically refreshed.
 You need to set it before loading ad.
 */
public void setRefreshTime(int refreshTime){
    if(controller != null){
        controller.setRefreshTime(refreshTime);
    }
}  

设置回调函数

对于广告请求,需要设置回调的方法有以下几个:

public interface BannerAdListener {
    /**
     * called when the ads loaded unsuccesfully
     */
    void onLoadFailed(String msg);
    /**
     * called when the ads loaded succesfully
     */
    void onLoadSuccessed();
    /**
     * called when the ads be shown
     */
    void onLogImpression();      
    /**
     * called when the ads be clicked
     */
    void onClick();
    /**
     * called when leaved app after clicked the ads
     */
    void onLeaveApp();
    /**
     * empty implementation method,(It can be ignored)
     */      
     void showFullScreen();
    /**
     * empty implementation method,(It can be ignored)
     */ 
     void closeFullScreen();
    /**
     * called when the ads be closed
     */
     void onCloseBanner();

}

请求并展示广告

方法如下:

public void load()

获取广告ID

SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到MTG

/**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()

释放MTGBannerView对象

在适当的时机调用release()方法来释放MTGBannerView对象的内存空间

@Override
protected void onDestroy() {
    super.onDestroy();
    if(mtgBannerView!= null){
        mtgBannerView.release();
    }
}

示例代码


xml:
    <com.mintegral.msdk.out.MTGBannerView
        android:id="@+id/mintegral_banner_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
java:        

    mtgBannerView = findViewById(R.id.mintegral_banner_view);
    mtgBannerView.init(new BannerSize(BannerSize.DEV_SET_TYPE,1294,720), "your placementId", UNIT_ID);
    mtgBannerView.setAllowShowCloseBtn(true);
    mtgBannerView.setRefreshTime(15);
    mtgBannerView.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");
        }
    });

    mtgBannerView.load();

原生(视频)广告接入

原生广告是时下非常流行的广告类型之一,广告sdk会将素材信息返回给您的app,您可以根据需要对元素进行组装和渲染,进而更贴近您的产品风格,用户体验更好。

注:该广告类型仅对部分开发者提供,如有需要请联系您的AM或致信developer@mintegral.com

广告效果示意:

初始化MtgNativeHandler

定义MtgNativeHandler,如下代码:

public MtgNativeHandler(Map<String, Object> map, Context context);

建议context 使用Application对象

设置回调函数

对于广告请求,需要设置回调的方法有以下几个:

public interface NativeAdListener {
    /**
     * called when the ads  loaded succesfully
     */
    public void onAdLoaded(List<Campaign> campaigns, int template);
    /**
     * called when the ads  loaded unsuccesfully
     */
    public void onAdLoadError(String message);
    /**
     * called when the ads  be clicked
     */
    public void onAdClick(Campaign campaign);
    /**
     * called when the ads  be clicked(It can be ignored)
     */
    public void onAdFramesLoaded(List<Frame> list);
    /**
     * called when the ads  be shown
     */
    public void onLoggingImpression(int adsourceType);
}

设置广告展示和点击之后的回调函数,回调方法有以下几个:


public interface NativeTrackingListener {
    /**
     * intercept showing default loading dialog
     */
    public boolean onInterceptDefaultLoadingDialog();
    /**
     * called when default dialog showing
     */
    public void onShowLoading(Campaign campaign);
    /**
     * called when default dialog dismissed
     */
    public void onDismissLoading(Campaign campaign);
    /**
     * called when Ads start to redirection
     */
    public void onStartRedirection(Campaign campaign, String url);
    /**
     * called when Ads finish redirection
     */
    public void onFinishRedirection(Campaign campaign, String url);
    /**
     * called when Ads finish redirection failed
     */
    public void onRedirectionFailed(Campaign campaign, String url);
    /**
     * called when Ads start to download
     */
    public void onDownloadStart(Campaign campaign);
    /**
     * called when Ads finish to download
     */
    public void onDownloadFinish(Campaign campaign);
    /**
     *called when Ads is downloading
     */
    public void onDownloadProgress(int progress);
}

请求广告

Mintegral sdk调用此方法时会优先从缓存里读取广告,如果缓存里有广告,则直接返回,进而提升展示效率;如果缓存里没有,则会向服务器发送广告请求获取广告。
注意:我们不建议开发者对campaign对象做缓存处理 请求方法如下:

public abstract boolean load();

渲染广告

您可以根据onAdLoaded的回调去渲染广告,同时对于原生广告我们会提供MTGMediaView去展示图片(视频)广告。MTGMediaView最佳设置的展示大小比例为16:9。调用以下方法去展示广告:

public void setNativeAd(Campaign campaign) 

广告选择图标

我们提供MTGAdChoice来渲染广告标记(Adchoice)。它是一个继承自ImageView的类。调用以下方法去渲染Adchoice。
Tip:我们强烈建议开发者规划合适位置展示此图标,若未展示,会影响您后续的广告收益。

public void setCampaign(Campaign campaign)

注册点击跳转事件

对view设置广告点击跳转事件

//Register the view which can be cliked to jump
//如果开发者自己加载广告图片,请在图片加载完成之后调用registerView
public void registerView(View view, Campaign campaign)
//Register the views which can be cliked to jump
public void registerView(View view, List<View> views, Campaign campaign)

释放NaitveHandler对象

在适当的时机调用release()方法来释放NaitveHandler对象的内存空间

@Override
protected void onDestroy() {
    if (mNativeHandle != null) {
        mNativeHandle.release();
    }
}

MTGMediaView一些功能API介绍

// Set up whether MTGMediaView can display full screen 
public void setIsAllowFullScreen(boolean isAllowFullScreen)
// Set up whether to allow image to display first when video is not ready to  be displayed
public void setAllowVideoRefresh(boolean allowVideoRefresh)
// Set up whether video is to be in loop play
public void setAllowLoopPlay(boolean allowLoopPlay)
// Set up whether video reloads when phone orientation alternates between horizontal and vertical
public void setAllowScreenChange(boolean allowScreenChange)

/**
* set video progress view Visibility
*
* @param isShown
*/
public void setProgressVisibility(boolean isShown)
/**
* set sound indicator view visible
*
* @param isShown
*/
public void setSoundIndicatorVisibility(boolean isShown)
/**
 * set video sound on or off
 *
 * @param isOn
 */
public void setVideoSoundOnOff(boolean isOn)

public interface OnMTGMediaViewListenerPlus {

    //called when the mediaview entered to fullscreen
    void onEnterFullscreen();

    //called when the mediaview out of fullscreen
    void onExitFullscreen();

    //called when the ads start to jump redirection
    void onStartRedirection(Campaign campaign, String url);

    //called when the ads finish jumping redirection
    void onFinishRedirection(Campaign campaign, String url);

    //called when the ads jumping redirection failed
    void onRedirectionFailed(Campaign campaign, String url);

    //called when the ads be clicked
    void onVideoAdClicked(Campaign campaign);

    //called when the ads be shown
    void onVideoStart();

    //called when the video of ad has finished playing completely
    void onVideoComplete();
}

示例代码

Map<String, Object> properties = MtgNativeHandler.getNativeProperties("your placementId", "your unitId");
//期望获取的广告数量
properties.put(MIntegralConstans.PROPERTIES_AD_NUM, AD_NUM);
//如果想要获取原生广告视频时长,则至少添加如下两对Key之一
properties.put(MIntegralConstans.NATIVE_VIDEO_WIDTH, 720);
properties.put(MIntegralConstans.NATIVE_VIDEO_HEIGHT, 480);
//填写true即可
properties.put(NATIVE_VIDEO_SUPPORT, true);
mNativeHandle = new MtgNativeHandler(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.mintegral_demo_mul_big_ad_content, null);
        final ImageView iv = (ImageView) view.findViewById(R.id.mintegral_demo_iv_image);
        final MTGMediaView mtgMediaView = (MTGMediaView) view.findViewById(R.id.mintegral_mediaview);
        MTGAdChoice adChoice = view.findViewById(R.id.mintegral_mediaview_adchoice);

        //Suggest to set the adChoice'size depends on campaign.getAdchoiceSizeHeight() and campaign.getAdchoiceSizeWidth() campaign.adChoiceIconSize
        RelativeLayout.LayoutParams Params =  (RelativeLayout.LayoutParams)view.getLayoutParams();
        Params.height = campaign.getAdchoiceSizeHeight();
        Params.width = campaign.getAdchoiceSizeWidth();
        adChoice.setLayoutParams(Params);
        adChoice.setCampaign(campaign);
        mtgMediaView.setNativeAd(mCampaign);

        // you can use your own view to display the native,but if it is a native-video,you must use MTGMediaView to display
        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.movbista_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) {
        // TODO Auto-generated method stub
        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推出的自动渲染原生广告,集成比普通原生广告更加简单,开发者只需提供宽高区域,MTG会自动展示与之契合的广告模板和素材。减少开发者对接成本的同时,更高效地利用MTG算法输出广告创意,进而提升开发者收入水平。

广告效果示意:

初始化MTGNativeAdvancedHandler

public MTGNativeAdvancedHandler(Activity activity, String placementId, String unitId)

设置NativeAdvancedAdListener

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 比例

mtgNativeAdvancedHandler.setNativeViewSize(advancedNativeW,advancedNativeH);

静音设置

静音按钮仅在视频区域在上方的布局方案下才展示(具体比例根据适配规则而定)

// 默认静音
mtgNativeAdvancedHandler.setPlayMuteState(MIntegralConstans.REWARD_VIDEO_PLAY_MUTE);

关闭按钮展示设置

/**
 *
 * @param mtgThreeState negative will hide close button,positive will display close button, other we will Decide whether to display based on the material
 */
mtgNativeAdvancedHandler.setCloseButtonState(MTGMultiStateEnum.positive);

播放规则设置

public interface AutoPlayMode {
    int PLAY_WHEN_NETWORK_IS_WIFI = 1;// wifi状态自动播放
    int PLAY_WHEN_USER_CLICK = 2;// 默认不播放,点击后播放
    int PLAY_WHEN_NETWORK_IS_AVAILABLE = 3;// 有网络即自动播放(默认)
}

mtgNativeAdvancedHandler.autoLoopPlay(AutoPlayMode.PLAY_WHEN_NETWORK_IS_AVAILABLE);

H5布局设置

可以通过传入JSON,来自定义广告的展示布局
target可以选择:title、subTitle、button、icon、container、mediaContent

![](./h5.jpg =320×250)

JSON格式举例如下:

{
    "list": [{
        "target": "title",
        "values": {
            "paddingLeft": 15,
            "backgroundColor": "yellow",
            "fontSize": 15,
            "fontFamily": "微软雅黑",
            "color": "red"
        }
    }, {
        "target": "mediaContent",
        "values": {
            "paddingTop": 10,
            "paddingRight": 10,
            "paddingBottom": 10,
            "paddingLeft": 10
        }
    }]
}

加载广告

public void load();

获取广告ID

SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到MTG

/**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()

判断广告是否准备好播放

public boolean isReady()

展示广告

获取广告试图

mAdvancedNativeView = mtgNativeAdvancedHandler.getAdViewGroup();

将广告试图添加到指定容器中

container = findViewById(R.id.mintegral_demo_advanced_native_ac_container);
container.addView(mAdvancedNativeView);

通知SDK

// 当系统的onResume被调用时候,必须要调用MTGNativeAdvancedHandler的onResume方法
public void onResume()
// 当系统的onPause被调用时候,必须要调用MTGNativeAdvancedHandler的onPause方法  
public void onPause()
public void release()

释放MTGNativeAdvancedHandler对象

在适当的时机调用release()方法来释放mtgNativeAdvancedHandler对象的内存空间

mtgNativeAdvancedHandler.release();

示例代码

mtgNativeAdvancedHandler = new MTGNativeAdvancedHandler(this,placementId, mUnitId);

mtgNativeAdvancedHandler.setNativeViewSize(advancedNativeW,advancedNativeH);
mtgNativeAdvancedHandler.setCloseButtonState(MTGMultiStateEnum.positive);
mtgNativeAdvancedHandler.setPlayMuteState(MIntegralConstans.REWARD_VIDEO_PLAY_MUTE);
mtgNativeAdvancedHandler.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);
mtgNativeAdvancedHandler.setViewElementStyle(jsonObject);
mAdvancedNativeView = mtgNativeAdvancedHandler.getAdViewGroup();

mtgNativeAdvancedHandler.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.mintegral_demo_advanced_native_ac_preload:
            mtgNativeAdvancedHandler.load();
            break;
        case R.id.mintegral_demo_advanced_native_ac_show:
            show();
            break;
        case R.id.mintegral_demo_advanced_native_ac_release:
            mtgNativeAdvancedHandler.release();
            break;
    }
}

@Override
protected void onResume() {
    super.onResume();
    if(mtgNativeAdvancedHandler != null){
        mtgNativeAdvancedHandler.onResume();
    }
}

@Override
protected void onPause() {
    super.onPause();
    if(mtgNativeAdvancedHandler != null){
        mtgNativeAdvancedHandler.onPause();
    }
}

@Override
protected void onDestroy() {
    if(mtgNativeAdvancedHandler != null){
        mtgNativeAdvancedHandler.release();
    }
    super.onDestroy();
}

激励视频广告接入

激励视频是Mintegral平台效果非常好的广告形式,用户可以通过观看一段广告视频而获取奖励,由于广告视频素材非常具有创意和吸引力,因此会引起很多用户的兴趣,进而下载广告产品

广告效果示意:

配置AndroidManifest.xml

<activity
    android:name="com.mintegral.msdk.reward.player.MTGRewardVideoActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:exported="false"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />

硬件加速

在application节点下修改"android:hardwareAccelerated"的属性值:

<application
    ...
    android:hardwareAccelerated="true">
    ...
    ...
    ...
    ...

</application>

初始化MTGRewardVideoHandler

public MTGRewardVideoHandler(Context context, String placementId, String unitId)  

设置RewardVideoListener

注:对于 void onAdClose(boolean isCompleteView, String rewardName, float rewardAmout) ,此方法里的 rewardName、rewardAmout 这两个参数是无意义的,且我们不会下发奖励。因此,你可以根据 isCompleteView 来决定是否给用户下发奖励。

public interface RewardVideoListener {
    /**
     * Called when the ad is loaded , and is ready to be displayed completely
     * @param unitId
     */
    void onVideoLoadSuccess(String placementId, String unitId);
    /**
     * Called when the ad is loaded , but is not ready to be displayed completely
     * @param unitId
     */
    void onLoadSuccess(String placementId, String unitId);
    /**
     * Called when the ad is load failed with the errorMsg
     * @param errorMsg
     */
    void onVideoLoadFail(String errorMsg);
    /**
     * Called when the ad is shown
     */
    void onAdShow();
    /**
     * Called when the ad is closed
     * @param isCompleteView if it is true,it means the video has been watched completely
     * @param rewardName   The rewardname after you watched the video completely
     * @param rewardAmout  The rewardamount after you watched the video completely
     */
    void onAdClose(boolean isCompleteView, String rewardName, float rewardAmout);
    /**
     * Called when the ad is shown failed
     * @param errorMsg
     */
    void onShowFail(String errorMsg);
    /**
     * Called when the ad is clicked
     * @param unitId
     */
    void onVideoAdClicked(String placementId, String unitId);
    /**
     * Called when the ad played completely
     * @param unitId
     */
    void onVideoComplete(String placementId, String unitId);
    /**
     * Called when the ad endcard be shown
     * @param unitId
     */
    void onEndcardShow(String placementId, String unitId);

静音设置

在调用load之前调用API

//静音
mMTGRewardVideoHandler.playVideoMute(MIntegralConstans.REWARD_VIDEO_PLAY_MUTE);
//默认非静音
mMTGRewardVideoHandler.playVideoMute(MIntegralConstans.REWARD_VIDEO_PLAY_NOT_MUTE);

Reward Plus 设置

必须在load之前调用
该API仅表示接受投放Reward plus的广告,下发奖励依然依赖SDK中 onAdClose() 回调的奖励数量货币信息参数(RewardName,RewardAmout)进行奖励发放。

public void setRewardPlus(boolean isRewardPlues)//在load之前调用,默认为false
//示例:
mMTGRewardVideoHandler.setRewardPlus(true);

加载广告和展示广告

建议开发者在展示广告之前,提前进行广告加载(如初始化时或每次关闭广告后),进而给素材等资源的下载提供时间,减少用户在展示广告时等待的时间,提高用户体验和广告时间。调用以下方法来进行广告的加载和展示:

public void load()
public void show(String rewardId)//rewardId默认传1就好
public void show(String rewardId, String userId) //userId在服务器回调中用到

获取广告ID

SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到MTG

/**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()

判断广告是否准备好播放

通过该方法来判断视频素材已经可以达到播放状态,建议在可播放情况下才进行广告的展示。

//Check if the ad is ready to show
public boolean isReady()
//This method is not recommended for use with load()  
//For example, the following way is not recommended.
if (mMTGRewardVideoHandler.isReady()) {
    mMTGRewardVideoHandler.load();
}

示例代码

MTGRewardVideoHandler mMTGRewardVideoHandler = new MTGRewardVideoHandler(this, "your placementId", "your unitId");
mMTGRewardVideoHandler.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();
    }

});
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:
                mMTGRewardVideoHandler.load();
                break;
            case R.id.bt_show:
                if (mMTGRewardVideoHandler.isReady()) {
                    mMTGRewardVideoHandler.show("your rewarid", "your userid");
                }
                break;
        }
    }
}

设置服务端回调

您可以根据需要选择通过sdk或者服务端回调信息。若需要设置服务端回调,可以在后台添加callbackURL,Mintegral会在视频播放完成后调用callbackurl给予信息的回调。

1.创建广告位时设置回调方式
![](./rewardvideo_callback.png =350×560)

在用户完成任务之后,Mintegral服务器会向开发者服务器发送请求(callbackURL)来告知开发者服务器用户此次任务所获得的积分。对于开发者来说,服务端回调更加安全。

2.对于声明callbackUrl,只需要开发者修改域名部分

例如:
https://www.sampleurl.com/mintegral?user_id={user_id}&trans_id={trans_id}&reward_amount={reward_amount}&reward_name={reward_name}&sign={sign}&unit_id={unit_id}

3.Mintegral Server获知到该user_id增加积分后,通过callback url通知开发者服务端。callback url附加的参数如下:

参数 说明
user_id 用户ID,由开发者设置
reward_amount 用户应该获得的积分
reward_name 积分的名称
unit_id 广告位ID
trans_id 传输ID,Mintegral服务端生成,具有唯一性,
sign 加密标识 MD5(user_id_reward_amount_trans_id_security_key)

4.开发者服务端一旦收到postback后,需给Mintegral服务端返回200或403。

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广告会有更好的视觉效果和体验。

广告效果示意


配置AndroidManifest.xml

<activity
    android:name="com.mintegral.msdk.interstitial.view.MTGInterstitialActivity"
    android:screenOrientation="portrait"
    android:exported="false"
    android:configChanges="orientation|screenSize"/>

创建MTGInterstitialHandler对象

public MTGInterstitialHandler(Context context, Map<String, Object> params) 

设置InterstitialListener

public interface InterstitialListener {

    /**
     * Ad requested successfully
     */
    public void onInterstitialLoadSuccess();
    /**
     * Ad requested unsuccessfully
     * @param errorMsg explains reason for failure
     */
    public void onInterstitialLoadFail(String errorMsg);
     /**
     * successfully opens Interstitial
     */
    public void onInterstitialShowSuccess();
    /**
     * Interstitial opens unsuccessfully
     * @param errorMsg explains reason for failure
     */
    public void onInterstitialShowFail(String errorMsg);
    /**
     * Interstitial closed
     */
    public void onInterstitialClosed();
    /**
     * Ad clicked
     */
    public void onInterstitialAdClick();

}

加载广告和展示广告

public void preload()//preload
public void show()//Display

获取广告ID

SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到MTG

/**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()

示例代码

HashMap<String, Object> hashMap = new HashMap<String, Object>();    
hashMap.put(MIntegralConstans.PLACEMENT_ID, "your placementId");
hashMap.put(MIntegralConstans.PROPERTIES_UNIT_ID, "your unitId");
mInterstitialHandler = new MTGInterstitialHandler(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");
    }
});
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;
        }
    }
}

插屏视频广告接入

插屏视频广告是插屏图片广告的升级版本,展示广告时会给用户展示一个全屏或半屏的视频,通过更有吸引力的视频提高用户的兴趣。

广告效果示意

配置Androidmanifest.xml文件

<activity
    android:name="com.mintegral.msdk.reward.player.MTGRewardVideoActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:exported="false"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />

创建MTGInterstitialVideoHandler对象

public MTGInterstitialVideoHandler(Context context, String placementId, String unitId)

设置InterstitialVideoListenr

public interface InterstitialVideoListenr  {

    /**
     * Called when the ad is loaded , but is not ready to be displayed completely
     * @param unitId
     */
    void onLoadSuccess(String placementId, String unitId);
    /**
     * Called when the ad is loaded , and is ready to be displayed completely
     * @param unitId
     */
    void onVideoLoadSuccess(String placementId, String unitId);
    /**
     * Called when the ad is load failed with the errorMsg
     * @param errorMsg
     */
    void onVideoLoadFail(String errorMsg);
    /**
     * Called when the ad is shown
     */
    void onAdShow();
    /**
     * Called when the ad is closed
     * @param isCompleteView if it is true,it means the video has been watched completely
     */
    void onAdClose(boolean isCompleteView);
    /**
     * Called when the ad is shown failed
     * @param errorMsg
     */
    void onShowFail(String errorMsg);
    /**
     * Called when the ad is clicked
     * @param unitId
     */
    void onVideoAdClicked(String placementId, String unitId);
    /**
     * Called when the ad played completely
     * @param unitId
     */
    void onVideoComplete(String placementId, String unitId);
    /**
     * Called when the ad close if developer set iv reward.
     *
     * @param isComplete complete
     * @param rewardAlertStatus alert status
     */
    void onAdCloseWithIVReward(boolean isComplete, int rewardAlertStatus);
    /**
     * Called when the ad endcard be shown
     * @param unitId
     */
    void onEndcardShow(String placementId, String unitId);

}

静音设置

在调用load之前调用API

//静音
mMtgInterstitalVideoHandler.playVideoMute(MIntegralConstans.REWARD_VIDEO_PLAY_MUTE);
//默认非静音
mMtgInterstitalVideoHandler.playVideoMute(MIntegralConstans.REWARD_VIDEO_PLAY_NOT_MUTE);

提示用户观看视频或试完完毕可获取奖励的弹窗的设置

在调用load之前调用API

/**
 * (可选)
 * 调用此方法后,当视频/playable播放或者用户点击关闭按钮时,会弹出一个窗口,提示用户观看视频或试完完毕可获取奖励。
 * 此方法接受两个参数。
 * 
 * @param rewardType 表示弹窗的时机。
 *                   一共两个预设值可选。
 *                   com.mintegral.msdk.MIntegralConstans#IVREWARD_TYPE_CLOSEMODE,此值表示当用户在点击关闭按钮时弹窗。
 *                   com.mintegral.msdk.MIntegralConstans#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

示例代码

mMtgInterstitalVideoHandler.setIVRewardEnable(MIntegralConstans.IVREWARD_TYPE_CLOSEMODE, 30);

自定义奖励弹窗的展示内容

最好在调用load之前调用API

/**
 * (可选)
 *  调用此方法可以设置奖励弹窗的文字信息。
 *  
 * @param confirmTitle   弹窗中需要显示的标题文字。
 * @param confirmContent 弹窗中需要显示的主题文字信息。
 * @param cancelText     取消按钮的文字信息。
 * @param confirmText    确认按钮的文字信息。
 *                   
 */
public void setAlertDialogText(String confirmTitle, String confirmContent, String confirmText, String cancelText)//自定义奖励弹窗的展示内容

示例代码

mMtgInterstitalVideoHandler.setAlertDialogText("Continue?", "If you continue, you can have reward when ad close.", "Continue", "Cancel");

加载广告和展示广告

public void load()//加载广告
public void show()//展示广告

获取广告ID

SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到MTG

/**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()

判断广告是否准备好播放

通过该方法来判断视频素材已经可以达到播放状态,建议在可播放情况下才进行广告的展示。

//Check if the ad is ready to show
public boolean isReady()
//This method is not recommended for use with load()  
//For example, the following way is not recommended.
if (mMtgInterstitalVideoHandler.isReady()) {
    mMtgInterstitalVideoHandler.load();
}

示例代码

MTGInterstitialVideoHandler mMtgInterstitalVideoHandler = new MTGInterstitialVideoHandler(this, "your placementId", "your unitid");  

mMtgInterstitalVideoHandler.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();
    }

    /**
     * If you called {@link MTGInterstitialVideoHandler#setIVRewardEnable(int, int)}
     * will callback this method.
     * You can decide whether to give users a reward based on the return value.
     *
     * @param isComplete complete status.
     *                   This parameter indicates whether the video or playable has finished playing.
     *
     * @param rewardAlertStatus interstitialVideo reward  alert  window status.
     *                          This parameter is used to indicate the status of the alert dialog.
     *                          If the dialog is not shown, it will return {@link MIntegralConstans#IVREWARDALERT_STATUS_NOTSHOWN}
     *                          If the user clicks the dialog's continue button, it will return {@link MIntegralConstans#IVREWARDALERT_STATUS_CLICKCONTINUE}
     *                          If the user clicks the dialog's cancel button, it will return {@link MIntegralConstans#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 == MIntegralConstans.IVREWARDALERT_STATUS_NOTSHOWN) {
            Log.e(TAG,"The dialog is not show.");
        }

        if (rewardAlertStatus == MIntegralConstans.IVREWARDALERT_STATUS_CLICKCONTINUE) {
            Log.e(TAG,"The dialog's continue button clicked.");
        }

        if (rewardAlertStatus == MIntegralConstans.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();
    }

});
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 (mMtgInterstitalVideoHandler != null) {

                    /**
                     * Optional.
                     *
                     * NOTE : Please make sure that you call before {@link MTGInterstitialVideoHandler#load()} method.
                     *
                     * Set the reward mode for interstitial video.
                     *
                     * Call this method when you want the IV to have a reward function.
                     * After calling this method, When the video or playable is playing,
                     * or the user clicked close button,
                     * a {@link android.app.AlertDialog} will appear at the set time,
                     * reminding the user to watch or play will get a reward.
                     *
                     * when IV closed will be called {@link InterstitialVideoListener#onAdCloseWithIVReward(boolean, int)},
                     * you can decide whether to give the reward based on that callback.
                     *
                     * @param rewardType Set the reward alert show time.
                     *                 {@link MIntegralConstans#IVREWARD_TYPE_CLOSEMODE} used when the user closes the video or playable.
                     *                 {@link MIntegralConstans#IVREWARD_TYPE_PLAYMODE} used to get rewards after playing the video for a few seconds.
                     *
                     * @param value Set the value of the interstitial video reward mode type.
                     *              In PLAYMODE, this value indicates a {@link android.app.AlertDialog} will appear after a few seconds of playback.
                     *              In CLOSEMODE, this value indicates when the user click the close button before the set time, {@link android.app.AlertDialog} will appear.
                     *
                     *              You can set {@link Integer} or {@link Double},
                     *              Integer values represent seconds and Double values represent percentages.
                     *              the Integer value range is 0-100, Double value range is 0.0-1.0.
                     *              The default value is 5s OR 80%(0.8).
                     */
                    mMtgInterstitalVideoHandler.setIVRewardEnable(MIntegralConstans.IVREWARD_TYPE_CLOSEMODE, 30);

                    /**
                     * Optional.
                     *
                     * Call this method when you wanna custom the reward alert dialog display text.
                     *
                     * @param confirmTitle title text for reward dialog.
                     * @param confirmContent content text for reward dialog.
                     * @param cancelText cancel button text for reward dialog.
                     * @param confirmText confirm button text for reward dialog.
                     */
                    mMtgInterstitalVideoHandler.setAlertDialogText("Continue?", "If you continue, you can have reward when ad close.", "Continue", "Cancel");

                    mMtgInterstitalVideoHandler.load();
                }
                break;
            case R.id.bt_show:
                if (mMtgInterstitalVideoHandler != null && mMtgInterstitalVideoHandler.isReady()) {
                    mMtgInterstitalVideoHandler.show();
                }
                break;
            case R.id.bt_mute:
                if (mMtgInterstitalVideoHandler != null) {
                    Toast.makeText(getApplicationContext(),"bt_mute",Toast.LENGTH_SHORT).show();
                    mMtgInterstitalVideoHandler.playVideoMute(MIntegralConstans.REWARD_VIDEO_PLAY_MUTE);
                }
                break;
            case R.id.bt_unmute:
                if (mMtgInterstitalVideoHandler != null) {
                    Toast.makeText(getApplicationContext(),"bt_unmute",Toast.LENGTH_SHORT).show();
                    mMtgInterstitalVideoHandler.playVideoMute(MIntegralConstans.REWARD_VIDEO_PLAY_NOT_MUTE);
                }
                break;
        }
    }
}

交互式广告接入

交互式广告是Mintegral推出的全新广告形态,通过该形式用户可以实际参与一个精心设计的交互广告(比如试玩一个游戏Demo),进而大大提升转化效果。当前广告内容以Playable为主。

注:该广告类型仅对部分开发者提供,如有需要请联系您的AM或致信developer@mintegral.com

广告效果示意:

配置Androidmanifest.xml文件

<activity 
    android:name="com.mintegral.msdk.interactiveads.activity.InteractiveShowActivity"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
    android:exported="false"
    android:configChanges="keyboardHidden|orientation|screenSize">
</activity>

创建MTGInteractiveHandler对象

public MTGInteractiveHandler(Context context, Map<String, Object> params)

设置InteractiveAdsListener

public interface InteractiveAdsListener {

    /**
     * campaign loadSuccessful
     * @param restype
     */
    void onInteractivelLoadSuccess(int restype);

    /**
     * resloadSuccess
     */
    void onInterActiveMaterialLoadSuccess();

    /**
     * loadfailed
     * @param errorMsg
     */
    void onInteractiveLoadFail(String errorMsg);

    /**
     * show sucessful
     */
    void onInteractiveShowSuccess();

    /**
     * show failed
     * @param errorMsg
     */
    void onInteractiveShowFail(String errorMsg);

    /**
     * click closedButton
     */
    void onInteractiveClosed();

    /**
     * click Campaign
     */
    void onInteractiveAdClick();

    /**
     * Called when the interactive Ads  showing sucessfully with playable
     * @isComplete means whether the interactive Ads play completely or not
     */
    void onInteractivePlayingComplete(boolean isComplete);
}

加载广告和展示广告

建议开发者在展示广告之前,提前进行广告加载(如初始化时或每次关闭广告后),进而给素材等资源的下载提供时间,减少用户在展示广告时等待的时间,提高用户体验和广告时间。调用以下方法进行广告的加载和展示:

public void load()//加载广告
public void show()//展示广告

获取广告ID

SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到MTG

/**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()

示例代码

HashMap<String, Object> hashMap = new HashMap<String, Object>();
hashMap.put(MIntegralConstans.PLACEMENT_ID, "your placementId");
hashMap.put(MIntegralConstans.PROPERTIES_UNIT_ID, "your unitid");
mtgInteractiveHandler = new MTGInteractiveHandler(this, hashMap);

mtgInteractiveHandler.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");
    }
});
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 (mtgInteractiveHandler != null) {
                    showLoadding();
                    mtgInteractiveHandler.load();
                }
                break;
            case R.id.bt_show:
                if (mtgInteractiveHandler != null) {
                    mtgInteractiveHandler.show();
                }
                break;
        }
    }
}

开屏广告接入

开屏式广告是目前比较流行的广告形式之一。这种类型比较适合投放电商、品牌类广告,流量接入上也很适合接入应用类流量。用户可以点击广告跳转到广告落地页,或者点击右上角的“跳过”按钮,跳转到app内容首页。开屏广告会在您的应用开启时加载,展示完毕后自动关闭并进入您的应用主界面。

分类:开屏广告分为半屏和全屏,在半屏情况下,支持定义logo图片,同时也支持横竖屏。

广告效果示意:

配置Androidmanifest.xml文件

需要在相应的activity里加上如下配置:

android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="false"
android:screenOrientation="竖屏或者横屏"

其中screenOrientation可以自定义

创建MTGSplashHandler对象

/**
 * @param placementId placementId
 * @param unitId  ad unit
 */
public MTGSplashHandler(String placementId, String unitId)

/**
 * @param placementId placementId
 * @param unitId  ad unit
 * @param canSkip allow user skip splash ad
 * @param countDownS the time ad will play 2~10s
 */
public MTGSplashHandler(String placementId, String unitId, boolean canSkip, int countDownS)

/**
 * @param placementId placementId
 * @param unitId  ad unit
 * @param canSkip allow user skip splash ad
 * @param countDownS the time ad will play. must be in 2-10 s
 * @param orientation the screen orientation when ad is showing
 * @param logoSizeH logo view height
 * @param logoSizeW logo view width
 */
public MTGSplashHandler(String placementId, String unitId, boolean canSkip, int countDownS, int orientation, int logoSizeH, int logoSizeW)

设置加载超时时间(可选)

loadTimeOutMs:SDK在指定时间内没有完成广告加载(即加载超时),则直接关闭。单位是s。

 public void setLoadTimeOut(long loadTimeOutS)

其他设置

设置logo的size、设置方向。
注:

  1. LogoView的size不能超过屏幕的 0.25
  2. orientation默认是竖屏
public void setLogoView(View bottomView,int width,int height)

/**
 * @param orientation 方向可以选择如下
 *        Configuration.ORIENTATION_PORTRAIT
 *        Configuration.ORIENTATION_LANDSCAPE
 */
public void setOrientation(int orientation)

设置MTGSplashLoadListener

public interface MTGSplashLoadListener {
    void onLoadSuccessed(int reqType);
    void onLoadFailed(String msg,int reqType);
}

注:reqType为1,表示preLoad的回调;2表示loadAndShow的回调

设置MTGSplashShowListener

public interface MTGSplashShowListener {

    /**
     *onShowSuccessed
     */
    void onShowSuccessed();

    /**
     *onShowFailed
     * @param msg
     */
    void onShowFailed(String msg);

    /**
     *onAdClicked
     */
    void onAdClicked();

    /**
     * onDismiss
     * 开屏页面关闭
     * @param type 开屏页面关闭的方式:1 是用户点击跳过;2 是倒计时结束 3 点击广告后跳出app
     */
    void onDismiss(int type);

    /**
     * 倒计时回调
     * @param millisUntilFinished 距离倒计时结束的时间,单位ms
     */
    void onAdTick(long millisUntilFinished);
}

加载广告和展示广告

我们提供两种请求展示广告方式:

先预请求广告,再在合适的时机去展示广告

public void preLoad()
public void show( ViewGroup container)// container:承载广告的容器

实时请求并展示广告

public void loadAndShow( ViewGroup container)

获取广告ID

SDK在广告展示过程当中产生的问题,开发者可以通过此API将广告ID记录并反馈到MTG

/**
* 在loadSuccess之后调用
* @return requestId
*/
public String getRequestId()

判断广告是否准备好播放

通过该方法来判断视频素材已经可以达到播放状态,建议在可播放情况下才进行广告的展示。

public boolean isReady()

注:建议在合适的时机preload,生命周期内preload时机最好不要距离show时间过长,建议不超过30分钟,调用preload后,在show场景时可以通过isready判断,如果ready则调用show。如果不ready可以调用 load&show。

通知SDK

public void onResume()//通知我们页面可以显示出来
public void onPause()//通知我们页面可以被隐藏
public void onDestroy()//通知我们销毁资源

示例代码

mtgSplashHandler = new MTGSplashHandler("your placementId", mUnitId);
mtgSplashHandler.setLoadTimeOut(loadTimeOut);
Button textView = new Button(this);
textView.setText("logo");
mtgSplashHandler.setLogoView(textView, 100, 100);

mtgSplashHandler.setSplashLoadListener(new MTGSplashLoadListener() {
    @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();
    }
});

mtgSplashHandler.setSplashShowListener(new MTGSplashShowListener() {
    @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.mintegral_demo_splash_ac_load_show:

            mtgSplashHandler.loadAndShow(container);
            break;

        case R.id.mintegral_demo_splash_ac_preload:

            mtgSplashHandler.preLoad();
            break;

        case R.id.mintegral_demo_splash_ac_show:

            if (mtgSplashHandler.isReady()) {
                mtgSplashHandler.show(container);
            } else {
                Log.e(TAG, "isready is false");
            }
            break;
    }
}

@Override
protected void onResume() {
    super.onResume();
    if(mtgSplashHandler != null){
        mtgSplashHandler.onResume();
    }
}

@Override
protected void onPause() {
    super.onPause();
    if(mtgSplashHandler != null){
        mtgSplashHandler.onPause();
    }
}

@Override
protected void onDestroy() {
    if(mtgSplashHandler != null){
        mtgSplashHandler.onDestroy();
    }
    super.onDestroy();
}

Test ID

您在测试期间所获取的广告均为Mintegral的正式广告,因此会受到算法智能优化的影响,如果测试期间经常load失败,返回EXCEPTION_RETURN_EMPTY,可使用以下测试id进行测试。

AppKey 7c22942b749fe6a6e361b675e96b3ee9
AppID 118690
Ad format Placement ID Sample ad unit ID
Banner 138791 146879
Native 138780 146868
Feeds Video 138788 146876
Offerwall 138789 146877
Rewarded Video 138786 146874
Static Interstitial 138783 146871
Interstitial Video 138781 146869
Interactive Ads 138790 146878
Splash 173349 209547
Automatic Rending Native 202132 258656

集成建议&常见问题

集成建议

1.在Application中初始化SDK。
2.在load成功后的onAdLoaded中进行preload, 保证广告的展示速度,这样才能获取更好的收益。
3.register时一定要对ViewGroup,不要只对Button, 保证广告的可点击区域,这个对收益影响很大。
4.广告展示布局的CTA按钮可以用TextView, 如果用Button会拦截事件。
5.一个广告位对应一个MtgNativeHandler, 保证每个广告位的唯一性。
6.在APP首页进行墙的预加载。
7.如果想监听墙入口的事件,可以在墙入口ViewGroup设置onTouch事件。

常见问题

1.返回的广告为什么有的是中文,但是手机设置是英文?
答:广告内容和手机设定的语言无关,会与用户的网络IP有关

2.为什么广告第一次跳转很慢?
答:广告会经过多层302跳转,拿到最终链接进行跳转,NativeHandler可以接收到广告的跳转的结束,开发者可以在这个时间段设置Loading对话框

3.激励视频从Google play切换回来之后黑屏了?
请确保manifest.xml文件中对RewardVideo是这样声明的

<activity
    android:name="com.mintegral.msdk.reward.player.MTGRewardVideoActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />

接口状态返回说明

msg 含义
EXCEPTION_RETURN_EMPTY 没有广告填充,可能导致的原因:1.您在测试期间所获取的广告均为Mintegral的正式广告,因此会受到算法智能优化的影响,若一段时间内大量加载和展示广告,可能导致一段时间后没有广告填充的现象。2.应用是上架Google Play的,但测试的网络状态是中国大陆网络。3.后台创建没有添加包名。4.后台将黑名单当做白名单,黑名单是选择你不想要投放的广告分类,请勿全选。
EXCEPTION_SIGN_ERROR appID和appKey不匹配,解决方案:检查APPkey和APPID是否填写正确,APPkey可以在应用设置(APP Setting)模块顶部获取
EXCEPTION_TIMEOUT 请求超时
EXCEPTION_UNIT_NOT_FOUND 该unitID不存在/填写错误
EXCEPTION_UNIT_ID_EMPTY unitID没传
EXCEPTION_UNIT_NOT_FOUND_IN_APP 在该appID和unitID不匹配
EXCEPTION_UNIT_ADTYPE_ERROR 传入的unitID广告类型不符
EXCEPTION_APP_ID_EMPTY appID没有传入
EXCEPTION_APP_NOT_FOUND 该appID不存在/填写错误
EXCEPTION_IV_RECALLNET_INVALIDATE 请求时的网络状态不对,一般是SDK初始化还未完成就去请求导致的
EXCEPTION_SERVICE_REQUEST_OS_VERSION_REQUIRED 无法取得osVersion,一般是GDPR开关导致的
NO_ADS_SOURCE 没有可用的广告源
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 save failed H5 zip包保存异常
data load failed, errorMsg is Network error,please check 网络状态为不可用
可能原因:
1. 请求API 结束后,获取网络状态为不可用
2. 请求API结束后,拿到的API http 的resp为空
content write failed H5源码保存异常
file is not effective 视频文件无效
可能原因:
1. 视频文件是否存在
2. 视频文件是一个文件,不是文件夹
3. 视频文件可读
MD5 check failed 1. 视频文件内容md5与服务端下发的不匹配
2. 客户端生成Md5异常
data load failed, errorMsg is The server returns an exception 1. 服务端返回的code 非 200/206
2. code OK的情况下 body 为空
resource load timeout Load Action 整体 60s 超时
CURRENT_UNIT_IS_LOADING 当前的load请求没有结束再次点击load
EXCEPTION_FILTER_BY_PLACEMENTID_INCONSISTENT placementId填写错误
EXCEPTION_UNIT_BIDDING_TYPE_ERROR bidding type错误,只能重新创建unitID

欧盟GDPR版本须知:

从2018年5月25日开始,欧盟的“通用数据保护条例”(GDPR)将生效。 开发者需要更新Mintergal SDK并按以下方法集成,否则会影响广告正常投放。目前只有8.11.0以上版本才支持GDPR,同时,我们更新了Mintegral隐私政策

接口介绍

1.设置是否获取用户信息的开关,此方法需要在SDK初始化之前调用

void setConsentStatus(Context context,int status);

示例代码:

MIntegralSDK sdk = MIntegralSDKFactory.getMIntegralSDK();
Map<String, String> map = sdk.getMTGConfigurationMap("your appId", "your appKey");
sdk.setConsentStatus(MainApplication.this, MIntegralConstans.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初始化

/**
 * 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);

示例代码

MIntegralSDK sdk = MIntegralSDKFactory.getMIntegralSDK();
Map<String, String> map = sdk.getMTGConfigurationMap("your AppId", "your AppKey");
sdk.init(map, MainApplication.this);
sdk.setDoNotTrackStatus(false);

ChangeLog

版本号 ChangeLog 发布时间
15.4.0 1、适配AndroidX
2、修复一些问题,优化性能
2020.12.10
15.3.1 1、适配AndroidX
2、修复某些情况视频播放失败的问题
2020.11.24
15.3.0 1、适配AndroidX
2、针对Android异形屏适配
2020.11.20
15.2.4 1、适配AndroidX
2、修复一些问题,优化性能
2020.11.11
15.2.2 1、适配AndroidX
2、提升sdk稳定性
2020.11.05
15.2.1 1、适配AndroidX
2、提升sdk稳定性
2020.11.04
14.6.2 1、适配AndroidX
2、修复一些问题,优化性能
2020.10.30
14.6.1 1、适配AndroidX
2、修复一些问题,优化性能
2020.10.23
14.6.0 1、适配AndroidX
2、修复一些问题,优化性能
2020.10.15
14.5.0 1、适配AndroidX
2、新增广告Id获取
3、新增下载二次弹窗确认逻辑
4、修复一些问题
2020.09.18
14.4.6 1、适配AndroidX
2、提升sdk稳定性
2020.09.17
14.4.5 1、适配AndroidX
2、修复一些问题
2020.09.14
14.4.4 1、适配AndroidX
2、修复一些问题
2020.09.04
14.4.0 1、适配AndroidX
2、新增Reward Plus
3、优化性能
2020.08.13
14.3.0 1、适配AndroidX
2、NativeVideo新增播放完成回调和视频时长属性
3、优化性能
4、修复一些问题
2020.07.24
14.2.6 1、适配AndroidX
2、优化性能
3、修复一些问题
2020.07.21
14.2.5 1、适配AndroidX
2、将在SDK中的网络安全配置交给开发者配置
3、修复一些问题
2020.07.09
14.2.3 1、适配AndroidX
2、修复一些问题
2020.07.04
14.2.2 1、适配AndroidX
2、优化性能
3、修复一些问题
2020.06.30
14.2.1 1、适配AndroidX
2、优化性能
3、修复一些问题
2020.06.30
14.2.0 1、适配AndroidX
2、修复一些问题
2020.06.23
14.1.0 1、适配AndroidX
2、新增SDK初始化成功和失败的回调
2020.06.04
14.0.0 1、适配AndroidX
2、新增自动渲染原生广告样式
3、修复一些问题
2020.05.26
13.1.1 1、适配AndroidX
2、修复一些问题
3、优化性能
2020.04.27
13.1.0 1、适配AndroidX
2、所有广告类型初始化时增加placementId
3、修复一些问题
2020.04.16
13.0.4 1、适配AndroidX
2、优化 load 流程:减少 timeout 出现的情况和优化触发多次 load 时给开发者回调的问题
3、修复一些问题
2020.03.26
13.0.3 1、适配AndroidX
2、修复开屏展示上报问题
2020.03.20
13.0.2 1、适配AndroidX
2、修复sdk在check isready 时候在弱网情况下引发的load超时问题
3、删除 runtime 的高风险代码
2020.03.20
13.0.1 1、适配AndroidX
2、修复一些问题
2020.03.12
13.0.0 1、适配AndroidX
2、新增开屏广告样式
3、适配中英文下载进度条
4、修复已知bug
2020.03.09
12.2.3 1、适配AndroidX
2、修复一些问题
2020.03.05
12.2.2 1、适配AndroidX
2、优化性能
2020.03.03
12.2.1 1、适配AndroidX
2、修复可能导致NativeVideo无法正常播放的问题
2020.02.20
12.2.0 1、适配AndroidX
2、新增 IV 试玩弹窗、奖励弹窗设置等
3、RV & IV 静音设置优化,播放时以开发者的设置为准
4、内部优化
2020.02.16
12.1.5 1、适配AndroidX
2、新增banner的关闭回调
2020.01.10
12.1.2 1、适配AndroidX
2、新增支持智能下载
3、修复aa类无法找到问题
2019.12.26
12.1.1 1、适配AndroidX
2、修复判定BannerView展示失败的问题
2019.12.19
12.1.0 1、适配AndroidX
2、修复bitmap异常
3、内部优化
2019.12.13
12.0.0 1、适配AndroidX
2、修改判断BannerView被遮盖的判定条件
3、修复BannerView被放置于可滑动组件中时,可能出现的自动刷新及点击异常
4、修复可能造成NativeVideo展示回调异常的问题。
2019.12.06
10.9.0 1、未适配AndroidX
2、修复一些问题,优化性能
2020.11.09
10.8.0 1、未适配AndroidX
2、修复一些问题,优化性能
2020.10.15
10.7.1 1、未适配AndroidX
2、修复4.4及以下版本兼容问题
2020.09.24
10.7.0 1、未适配AndroidX
2、新增广告Id获取
3、新增下载二次弹窗确认逻辑
4、修复一些问题
2020.09.18
10.6.6 1、未适配AndroidX
2、提升sdk稳定性
2020.09.17
10.6.5 1、未适配AndroidX
2、修复一些问题
2020.09.15
10.6.4 1、未适配AndroidX
2、修复一些问题
2020.09.04
10.6.0 1、未适配AndroidX
2、新增Reward Plus
3、优化性能
2020.08.17
10.5.1 1、未适配AndroidX
2、NativeVideo新增播放完成回调和视频时长属性
3、优化性能
4、修复一些问题
2020.07.27
10.5.0 1、未适配AndroidX
2、将在SDK中的网络安全配置交给开发者配置
3、修复一些问题
2020.07.10
10.4.0 1、未适配AndroidX
2、新增SDK初始化成功和失败的回调
3、优化性能
4、修复一些问题
2020.07.01
10.3.0 1、未适配AndroidX
2、新增自动渲染原生广告样式和开屏广告样式
3、修复一些问题
2020.05.27
10.2.5 1、未适配AndroidX
2、修复一些问题
2020.05.14
10.2.4 1、未适配AndroidX
2、修复一些问题
2020.03.12
10.2.3 1、未适配AndroidX
2、优化性能
2020.03.03
10.2.2 1、未适配AndroidX
2、修复Setting无法获取时可能导致的Offer过期判定失误的问题
3、修复NativeVideo二跳页在特定场景顶部可能出现白条的问题
2020.02.26
10.2.1 1、未适配AndroidX
2、新增banner的关闭回调
2020.01.10
10.2.0 1、未适配AndroidX
2、新增支持智能下载
3、修复aa类无法找到问题
2019.12.30
10.1.9 1、未适配AndroidX
2、修复判定BannerView展示失败的问题
2019.12.18
10.1.8 1、未适配AndroidX
2、修改判断BannerView被遮盖的判定条件
3、修复BannerView被放置于可滑动组件中时,可能出现的自动刷新及点击异常
4、修复可能造成NativeVideo展示回调异常的问题
2019.12.06
10.1.7 1、未适配AndroidX
2、开发者书旗反馈小米Mix3 退后台视频播放失败问题修复
3、Banner回调两次问题修复
4、开发者反馈华为oaid aidl文件混淆与不混淆冲突问题修复
5、修复MTGActivity有可能导致的Crash
6、修复MTGCommonActivity有可能导致的崩溃
2019.11.29
10.1.6 AndroidX适配定制版 2019.11.14
10.1.0 1、支持om测试 2、Mraid expand支持 3、Banner回调优化 2019.09.24
10.0.0 新增banner样式 2019.08.27
9.13.1 1、支持Mraid协议 2019.07.09
9.12.4 1、新增Head-Bidding功能 2019.06.20
9.12.2 移除定位相关代码 2019.06.14
9.11.0 RV/IV 回退键逻辑优化 2019.05.10
9.10.0 优化了RV和IV广告的逻辑 2019.03.25
9.9.1 Nativevideo功能优化 2019.03.12
9.9.0 优化性能 2019.03.06
9.8.0 优化性能 2019.02.22
9.7.0 修复一些问题 2019.02.01
9.6.0 新增Adchoice 2019.01.10
9.5.0 Android系统下载器适配优化 2018.12.29
9.3.0 支持deeplink跳转 2018.12.06
9.2.0 Android系统下载器适配 2018.11.08
9.1.1 增加小程序跳转、支持https 2018.10.28
9.0.0 新增interactive Ad 2018.08.15
8.13.0 支持imei、mac、android id的获取 2018.06.27
8.12.0 新增shortcuts 2018.06.13
8.11.0 支持欧盟GDPR 2018.05.20
8.10.0 新增InterstitialVideo广告形式 2017.05.10
8.9.0 视频结果页点击后,可自动关闭 2018.03.26
8.8.0 mediaview支持gif 2018.03.12
8.7.0 优化整体广告 2018.02.29
8.6.0 RV支持设置静音 2018.01.26
8.5.0 支持视频重复播放功能 2017.12.04
8.4.0 修复了部分手机兼容问题 2017.11.14
8.3.0 修复了部分手机兼容问题 2017.09.04
8.2.0 新增NativeVideo功能 2017.08.02
8.1.0 修复了部分手机兼容问题 2017.11.14
8.0.0 修复了部分手机兼容问题 2016.12.06
回到顶部