| 版本 | 修订日期 | 修订说明 | 
|---|---|---|
| v2.5.02 | 2025-10-21 | 1.第三方广告网络SDK更新 2.优化已知问题 | 
接入集成可使用以下测试id:
| 第一组测试id(建议使用) | 第二组测试id(填充或不足) | ||
|---|---|---|---|
| 应用id | test0001 | 应用id | 743p10001095 | 
| 开屏广告 | sjmad_test002 | 开屏广告 | 743d10003212 | 
| 激励视频 | sjmad_test001 | 激励视频 | 743d10003212 | 
| 插屏(半屏) | sjmad_test004 | 插屏(半屏) | 743d10003213 | 
| 信息流 | sjmad_test005 | 信息流 | 743d10003215 | 
| banner(横幅) | sjmad_test003 | banner(横幅) | 743d10003216 | 
| 全屏视频 | sjmad_test006 | 全屏视频 | 743p10001095 | 
| 开发者自渲染 | sjmad_test007 | 开发者自渲染 | 743d10003217 | 
| 全屏竖版视频流 | sjmad_test008 | 全屏竖版视频流 | |
| 短视频内容 | sjmad_test012 | 短视频内容 | 743d10003218 | 
| 其他 | 沟通索取 | ||
| 如需要正式的应用id和广告位id,可自行注册账户,创建应用和广告位。 | |||
| 账号注册及应用与广告位创建 | 
如对接上有任何技术或运营规则问题可以联系相关人员,微信:hzmaoyan,QQ:2538932178
SDK及DEMO下载
将本SDK压缩包内的maosdk_x.x.x.aar、maosdk_kssdk_x.x.x.aar复制到Application Module/libs文件夹(没有的话须手动创建), 并将以下代码添加到您Application Module的build.gradle中
repositories {
    flatDir {
        dirs 'libs'
    }
}
depedencies {
    implementation(name: 'maosdk_x.x.x', ext: 'aar')
    implementation(name: 'maosdk_kssdk_x.x.x', ext: 'aar')
    // SDK v2.1.1版本开始,SDK依赖appcompat-v7库,请确保⼯工程中有appcompat-v7
    implementation 'com.android.support:appcompat-v7:27.1.1'
    // 2.1.1之后的版本,SDK有依赖recyclerview-v7
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    // 需要支持AndroidX库
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}
若您的 targetSDKVersion>=23 ,您还需要在运行时进行动态权限申请(可参考示例工程)
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 安装APK权限-->
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.GET_TASKS" /> <!-- 如果有视频相关的广告且使用textureView播放,请务必添加,否则黑屏 -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
本SDK可运行于 Android5.0 (API Level 21) 及以上版本,请确保build.gradle中的minSdkVersion参数不小于21
x86、x86_64、armeabi、armeabi-v7a、arm64-v8a。如果您应用中支持的架构超出这五种,请在build.gradle中使用 abiFilters 选择支持的架构。如下所示android {
    defaultConfig{
        ndk { 
            // 设置支持的 SO 库构架,注意这里要根据你的实际情况来设置 abiFilters 
            'armeabi-v7a' 'arm64-v8a' 'x86' 'x86_64''armeabi'
        }
    }
}
开发者需要在Application#onCreate方法中调用以下代码来初始化sdk。 目前sdk已支持多进程,如果明确某个进程不会使用到广告sdk,可以只针对特定进程初始化广告sdk。
public class MainApplication extends Application {
    @Override
    public void onCreate(){
        super.onCreate();
        MaoSdk.init(this, "应用ID");
    }
} 
SDK为接入方提供了开屏广告,开屏广告建议为用户在进入App时展示的全屏广告。开屏广告为一个 View ,需要传入一个承载容器 ViewGroup ,宽高默认为 match_parent ,注意开屏广告容器 ViewGroup :width >=70% 屏幕宽,height >=50% 屏幕高,否则会影响计费。
public class MaoSplashAd {
    /**
     * @param activity 
     * @param adListener
     * @param posId 广告位id
     * @param fetchTimeOut 广告时长
     */
    public MaoSplashAd(Activity activity, MaoSplashAdListener adListener, String posId, int fetchTimeOut)
    
    /**
     * 设置开屏广告事件
     */
    public void setAdListener(MaoSplashAdListener adListener);
    public void fetchAndShowIn(ViewGroup adContainer);
}
public interface MaoSplashAdListener {
    /**
     * 加载成功
     */
    void onMaoAdLoaded();
    /**
     * 拉取广告超时
     */
    void onMaoAdLoadTimeOut();
    /**
     * 开屏广告展示
     */
    void onMaoAdShow();
    /**
     * 点击
     */
    void onMaoAdClicked();
    /**
     * 倒计时结束
     */
    void onMaoAdTickOver();
    /**
     * 开屏广告关闭
     */
    void onMaoAdDismissed();
    /**
     * 广告错误
     */
    void onMaoAdError(MaoAdError error);
}
    MaoSplashAd splashAd = new MaoSplashAd(this, this, "广告位id", 超时时长(int型,单位秒));
    splashAd.fetchAndShowIn(container);
SplashActivity#onCreate()生命周期内直接创建MaoSplashAd对象,创建MaoSplashAd对象需要延时本SDK为接入方提供激励视频广告,该广告的效果为观看完毕视频广告,发放奖励给用户。使用场景包括但不限于:
public class MaoRewardVideoAd{
    public MaoRewardVideoAd(Activity activity, String posId, MaoRewardVideoAdListener adListener);
    /**
     * 设置用户id
     */
    public void setUserId(String userId);
    /**
     * 加载广告
     */
    public void loadAd();
    /**
     * 展示广告
     */
    public void showAD();
}
public interface MaoRewardVideoAdListener{
    /**
     * 每次广告加载成功,会在此回调生生成一个唯一的tradeid
     */
    void onMaoAdTradeId(String tradeid, String tradeKey, String isVerify);
    /**
     * 视频素材缓存成功,可在此回调后进行广告展示
     */
    void onMaoAdLoaded(String adid);
    /**
     * 视频素材缓存成功,可在此回调后进行广告展示
     */
    void onMaoAdVideoCached();
    /**
     * 激励视频广告页面展示
     */
    void onMaoAdShow();
    /**
     * 广告展示出错
     */
    void onMaoAdShowError(MaoAdError adError);
    /**
     * 激励视频广告被点击
     */
    void onMaoAdClick();
    /**
     * 激励视频播放完毕
     */
    void onMaoAdVideoComplete();
    /**
     * 激励视频广告曝光
     */
    void onMaoAdExpose();
    /**
     * 激励视频触发激励(观看视频大于一定时长或者视频播放完毕)
     */
    void onMaoAdReward(String adid) ;
    /**
     * 激励视频广告被关闭
     */
    void onMaoAdClose() ;
    /**
     * 广告流程出错
     */
    void onMaoAdError(MaoAdError adError) ;
}
MaoRewardVideoAd rewardVideoAD = new MaoRewardVideoAd(this, "广告位id", this);
rewardVideoAD.setUserId("自身应用当前的userid"); 
rewardVideoAD.setRewardName("积分奖励");    //激励奖励名称
rewardVideoAD.setRewardAmount(1);   //激励奖励数
rewardVideoAD.setExtra("extStr");   //拓展参数
rewardVideoAD.loadAd();
==================MaoRewardVideoAdListener==================
    /**
     * 广告加载成功
     **/
    @Override
    public void onMaoAdLoaded(String adId){
        adLoaded = true;
        showStatus("onMaoAdLoad:广告加载成功");
    }
    /**
    * 视频素材缓存成功,可在此回调后进行广告展示
    */
    @Override
    public void onMaoAdVideoCached(){
        videoCached = true;
        showStatus("onMaoAdVideoCached:视频素材缓存成功,可在此回调后进行广告展示");
        //可以展示,视频已经缓存,展示没有进度条
        rewardVideoAD.showAD();
    }
本SDK为接入方提供个性化模板插屏广告,开发者不用自行对广告样式进行编辑和渲染,可直接调用相关接口获取广告 view,广告样式模板以及微调后期支持开发者编辑。
public class MaoInterstitialAd{
    public MaoInterstitialAd(Activity activity, String posId, MaoInterstitialAdListener adListener);
    public void loadAd();
    public void showAd();
}
public interface MaoInterstitialAdListener{
    void onMaoAdLoaded();
    void onMaoAdShow();
    void onMaoAdClicked();
    void onMaoAdError(MaoAdError adError);
    void onMaoAdClosed();
}
    MaoInterstitialAd interstitialAd = new MaoInterstitialAd(this, "广告位id", this);
    interstitialAd.loadAd();
==================MaoInterstitialAdListener==================
    /**
     * 广告加载成功,可在此回调后进行广告展示
     */
    void onMaoAdLoaded(){
        //展示广告
        interstitialAd.showAd();
    }
本SDK为接入方提供个性化模板 Banner 广告,开发者不用自行对广告样式进行编辑和渲染, Banner 广告为一个 View,需要传入一个承载容器 ViewGroup,广告样式模板以及微调后期支持开发者编辑。
public class MaoBannerAd{
    public MaoBannerAd(Activity activity, String posId, MaoBannerAdListener adListener);
    public MaoBannerAd(Activity activity, String posId, MaoBannerAdListener adListener, ViewGroup container);
    public void loadAD()
    //在loadAd前设置
    public void setBannerContainer(ViewGroup container);
}
public interface MaoBannerAdListener{
    void onMaoAdLoaded();
    void onMaoAdShow();
    void onMaoAdClicked();
    void onMaoAdClosed();
    void onMaoAdError(MaoAdError var1);
}
MaoBannerAd bannerAd = new MaoBannerAd(this, "广告位id", this);
bannerAd.setBannerContainer(bannerContainer);
bannerAd.loadAD();
本SDK为接入方提供全屏视频广告,该广告的效果播放全屏的视频,视频一定时间后可跳过,无需全程观看完。
public class MaoFullScreenVideoAd{
    public MaoFullScreenVideoAd(Activity activity, String podId, MaoFullScreenVideoAdListener adListener);
    public void loadAD();
    public void showAd();
}
public interface MaoFullScreenVideoAdListener{
    void onMaoAdLoaded();
    void onMaoAdShow();
    void onMaoAdClicked();
    void onMaoAdError(MaoAdError adError);
    void onMaoAdVideoCached();
    void onMaoAdClosed();
    void onMaoAdVideoComplete();
}
    MaoFullScreenVideoAd fullScreenVideo = new MaoFullScreenVideoAd(this, "广告位id", this);
    fullScreenVideo.loadAd();
==================MaoInterstitialAdListener==================
    void onMaoAdVideoCached(){
        fullScreenVideo.showAd();
    }
本SDK为接入方提供全屏竖版视频流广告,该广告适合在全屏竖版视频流中使用,接入方可以控制视频暂停或继续播放,默认视频播放不可干预,视频广告相关配置可以在平台设置。
支持的广告尺寸: 全屏竖版
//拉取多个MaoExpressFeedFullVideoAd(1-3)
public class MaoExpressFeedFullVideo{
    public MaoExpressFeedFullVideo(Activity activity, String posId, MaoExpressFeedFullVideoListener adListener);
    public MaoExpressFeedFullVideo(Activity activity, String posId, MaoSize viewSize, MaoExpressFeedFullVideoListener adListener)
    public void loadAd();
    public void loadAd(int count);  //count取值范围1-3
}
public interface MaoExpressFeedFullVideoListener{
    void onMaoAdError(MaoAdError error);
    void onMaoFeedFullVideoLoad(List<MaoExpressFeedFullVideoAd> ads);
}
MaoSize size = new MaoSize(1080, 1920);//size参数大小单位是dp
MaoExpressFeedFullVideo expressFullVideoFeed = new MaoExpressFeedFullVideo(this, "广告位id", size, new MaoExpressFeedFullVideoListener(){
    @Override
    public void onMaoAdError(MaoAdError error){
        Log.d("test", "MaoExpressFullVideoFeed2.onMaoAdError=" + error.getErrorMsg());
    }
    @Override
    public void onMaoFeedFullVideoLoad(List<MaoExpressFeedFullVideoAd> ads){
        Log.d("test", "MaoExpressFeedFullVideo.onMaoFeedFullVideoLoad");
    }
expressFullVideoFeed.loadAd(1);
本SDK为接入方提供原生模版信息流广告。
适用场景:
分类:
public class MaoNativeExpressAd{
    public MaoNativeExpressAd(Activity activity, String podId, MaoNativeExpressAdListener adListener, ViewGroup container);
    public void setSize(MaoSize MaoSize);
    public void loadAd();
}
public interface MaoNativeExpressAdListener{
    void onMaoAdLoaded();
    void onMaoAdShow();
    void onMaoAdClicked();
    void onMaoAdError(MaoAdError adError);
    void onMaoAdClosed();
}
MaoNativeExpressAd nativeExpressAd = new MaoNativeExpressAd(this, "广告位id", this, adContainer);
nativeExpressAd.setSize(new MaoSize(width, 0)); //width单位为dp,height=0为自适应高度
nativeExpressAd.loadAd();
本SDK为接入方提供原生模版信息流列表广告,用于将信息流广告插入列表的场景。
public class MaoNativeExpressAdList{
    public MaoNativeExpressAdList(Activity activity, String posId, MaoNativeExpressAdListListener adListener);
    /**
     * 信息流内容为视频时是否开启视频声音
     */
    public void setAutoPlay(boolean volumeOn);
    /**
     * 设置广告的尺寸,单位为DP
     */
    public void setSize(MaoSize MaoSize);
    /**
     * 加载广告
     */
    public void loadAd(int i);
}
public interface MaoNativeExpressAdListListener {
    
    /**
     * 加载成功
     */
    void onMaoNativeExpressAd(List<MaoNativeAd> ads);
    /**
     * 加载失败
     */
    void onMaoAdError(MaoAdError error);
}
MaoNativeExpressAdList expressAdList = new MaoNativeExpressAdList(this, "posId", new MaoNativeExpressAdListListener() {
            @Override
            public void onMaoNativeExpressAd(List<MaoNativeAd> adList) {
                if (mRecyclerView != null) {
                    mRecyclerView.setLoadingFinish();
                }
                if (adList == null || adList.isEmpty()) {
                    return;
                }
                int totalCount = mFeedList.size();
                for (MaoNativeAd MaoNativeAd : adList) {
                    if (MaoNativeAd == null) {
                        continue;
                    }
                    mFeedList.add(mFeedList.size(), new TestBean(MaoNativeAd, FeedRecyclerAdapter.ItemViewType.ITEM_VIEW_TYPE_AD));
                }
                mFeedRecyclerAdapter.notifyDataSetChanged();
            }
            @Override
            public void onMaoAdError(MaoAdError error) {
                if (mRecyclerView != null) {
                    mRecyclerView.setLoadingError();
                }
            }
        });
        expressAdList.setAutoPlay(true);
        expressAdList.setSize(new MaoSize(getScreenWidthDp(), 0));   //宽度单位为DP,高度0为自适应高度
        expressAdList.loadAd(1);
==================RecyclerView.Adapter==================
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
    if (viewHolder instanceof AdViewHolder) {
                final AdViewHolder adViewHolder = (AdViewHolder) viewHolder;
                final MaoNativeAd MaoNativeAd = (MaoNativeAd) mDataList.get(position).object;
                // 设置监听
                MaoNativeAd.setExpressInteractionListener(new MaoNativeAd.FeedFullVideoAdInteractionListener() {
                    @Override
                    public void onAdClicked(View view, int type) {
                    }
                    @Override
                    public void onAdShow(View view, int type) {
                    }
                    @Override
                    public void onRenderSuccess(View view, float width, float height) {
                        Log.d("main", "onRenderSuccess");
                    }
                    @Override
                    public void onRenderFail(View view, MaoAdError error) {
                    }
                });
                MaoNativeAd.render(adViewHolder.mAdContainer);
            }
}
前文介绍的 Banner 广告、插屏广告等,app会“收到”一个完整的 view 对象,开发者无法自定义广告 view 内部的组件布局(文字 TextView 、图片 ImageView ),而原生广告自渲染方式支持开发者自由拼合这些素材,最大程度的满足开发需求;与原生广告(模板方式)相比,自渲染方式更加自由灵活,开发者可以使用其为开发者的应用打造自定义的布局样式。
前提条件:
MediaView内部使用了TextureView,所以需要在开启硬件加速的窗口中才能使用。当 Android API>=14时,硬件加速默认是开启的适用场景:
使用自渲染 2.0 API拉取到的广告数据主要包含如下字段:
//负责加载
public class MaoNativeAd{
    public MaoNativeAd(Activity activity, String posId, MaoNativeAdListener adListener);
    public void loadAd();
}
//广告数据
public class MaoNativeAdData {
    /**
     * 将布局与广告进行绑定
     */
    public void bindAdToView(Context context, MaoNativeAdContainer container, FrameLayout.LayoutParams layoutParams, List<View> views);
    /**
     * 将布局与视频组件MediaView进行绑定
     */
    public void bindMediaView(MaoMediaView mediaView, MaoNativeAdMediaListener adListener);
    /**
     * 设置回调
     */
    public void setNativeAdEventListener(MaoNativeAdEventListener eventListener);
    /**
     * 获取广告标题,短文字
     */
    public String getTitle();
    /**
     * 获取广告描述,长文字
     */
    public String getDesc();
    /**
     * 获取Icon 图片地址
     */
    public String getIconUrl();
    /**
     * 获取大图地址
     */
    public String getImgUrl();
    /**
     * 获取广告样式
     * @see com.Mao.Maosdk.ad.MaoAdPatternType
     */
    public int getAdPatternType();
    /**
     * 获取三小图的地址
     */
    public List<String> getImgList();
    /**
     * 判断是否为app广告
     */
    public boolean isAppAd();
    /**
     * 获取应用状态
     */
    public int getAppStatus();
    /**
     * 获取广告的视频时长,广告加载成功即可获取,单位ms。
     * 注意:虽然此数值单位为ms,但实际精度为s(向上取整),例如视频真实时长 8100ms ,此处返回9000ms
     */
    public int getVideoDuration();
    /**
     * 获取大图素材的宽度
     */
    public int getPictureWidth();
    /**
     * 获取大图素材的高度
     */
    public int getPictureHeight();
    /**
     * 当宿主Activity.onResume()时调用,恢复广告状态,如果不调用会导致广告状态错乱
     */
    public void resume();
    /**
     * 当开发者不再使用广告,释放View等相关的资源,且广告失效,不能再次使用
     */
    public void destroy();
}
<!-- 自渲染容器 -->
<com.Mao.Maosdk.ad.natives.MaoNativeAdContainer
    android:id="@+id/nativeAdContainer"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <LinearLayout
        android:id="@+id/ad_ui_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:visibility="visible">
    <!-- 原生广告的标题 -->
    <TextView
        android:id="@+id/text_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="标题"
        android:ellipsize="end"
        android:singleLine="true"
        android:textColor="#e0000000" />
    <!-- 原生广告的描述 -->
    <TextView
        android:id="@+id/text_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="描述"
        android:ellipsize="end"
        android:maxLines="2"
        android:textColor="#a0000000" />
    ........
public interface MaoNativeAdListener {
    void onMaoNativeAdLoaded(MaoNativeAdData adData);
    void onMaoAdError(MaoAdError adError);
}
MaoNativeAd nativeAd = new MaoNativeAd(this, "广告位id", new MaoNativeAdListener() {
            @Override
            public void onMaoNativeAdLoaded(MaoNativeAdData MaoNativeAdData) {
                this.adData = MaoNativeAdData;
                renderAdUi(adData);
                bindAdEvent(adData);
            }
            @Override
            public void onMaoAdError(MaoAdError MaoAdError) {
                showError("onMaoAdError", MaoAdError.getErrorCode(), MaoAdError.getErrorMsg());
            }
        });
        nativeAd.loadAd();
MaoNativeAdContainer内提供一个视频内容频道供接入方接入,支持上下滑动切换视频内容。
前提条件:
(1)要支持androidx库
(2)需要support-v4或androidx.legacy:legacy-support-v4库
public class MaoContentAd{
    public MaoContentAd(Activity activity, MaoContentAdListener adListener, String posId);
    public void showAd(int layoutId);
    public void hideAd();
}
public interface MaoContentAdListener {
    void onMaoAdError(MaoAdError adError);
    void onPageEnter(KsContentPage.ContentItem item);
    void onPageResume(KsContentPage.ContentItem item);
    void onPagePause(KsContentPage.ContentItem item);
    void onPageLeave(KsContentPage.ContentItem item);
    void onVideoPlayStart(KsContentPage.ContentItem item);
    void onVideoPlayPaused(KsContentPage.ContentItem item);
    void onVideoPlayResume(KsContentPage.ContentItem item);
    void onVideoPlayCompleted(KsContentPage.ContentItem item);
    void onVideoPlayError(KsContentPage.ContentItem item, int what, int extra);
}
MaoContentAd contentAd = new MaoContentAd(this, this, "广告位id");
contentAd.showAd(R.id.main_container);
SDK为接入方提供了定制H5内容页:游戏,测试,积分消耗...
public class MaoUser{
    public String userID;       //用户ID
    public String userName;     //用户名
    public String userAvatar;   //用户头像URL
    public int userIntegral;    //用户积分
    public String deviceid;     //设备号 *android10以下传imei,10以上传oaid*
    public String ext = "";     //扩展参数
    public MaoUser(String userID, String userName, String userAvatar, int userIntegral)
    public MaoUser(String userID, String userName, String userAvatar, int userIntegral, String deviceId)
}
public class MaoH5Ad{
    public MaoH5Ad(Activity activity, MaoUser MaoUser, MaoH5ContentListener adListener, String posId);
}
public interface MaoH5ContentListener {
    /**
     * 积分不够
     */
    void onIntegralNotEnough(MaoUser user, int needIntegral);
    /**
     * 积分消耗
     *  expendIntegral>0,用户消耗了多少积分
     *  expendIntegral<0,用户任务完成领取了多少积分
     */
    void onIntegralExpend(MaoUser user, int expendIntegral);
    /**
     * 返回的是完成的任务总数
     */
    void onFinishTasks(MaoUser user, int finishTasks);
    /**
     * 退出H5
     */
    void onGameExit(MaoUser user);
    /**
     * 看广告奖励触发,此接口是完成总任务数返回的奖励接口
     */
    void onMaoAdReward(MaoUser user, int rewardIntegral);
    /**
     * h5页面中激励视频触发激励(观看视频大于一定时长或者视频播放完毕)
     */
    void onMaoAdReward(String adId);
    /**
     * h5页面中观看激励视频时视频加载成功的返回事件
     */
    void onMaoAdLoaded(String adId);
    /**
     * 每次广告加载成功,会在此回调生成一个唯一的广告id
     */
    void onMaoAdTradeId(String trade_id);
    /**
     * h5页面中观看激励视频时的点击广告的返回事件
     */
    void onMaoAdClick();
    /**
     * 用户页面的行为操作
     *  joinLottery --> 参与抽奖
     *  joinSurvey --> 参与测一测
     *  joinGuessingIdioms --> 参与猜成语
     *  stay60s --> 咨询浏览超过60s的回调
     *  joinGame --> 参与游戏
     *  taskSignIn --> 签到成功
     */
    void onMaoUserBehavior(String behavior);
}
//deviceId:android10以下传imei,10以上传oaid
MaoUser Maouser = new MaoUser("userID", "userName", "avatarUrl", (int) userIntegral, "deviceId");
MaoH5Ad h5Ad = new MaoH5Ad(activity, Maouser, MaoH5ContentListener, "广告位id");
重写加载MaoH5Ad的activity的onDestroy方法
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (h5Ad != null)
            h5Ad.onDestory();
    }
开发者如果需要配置隐私权限开关,则需要在每次初始化SDK前调⽤MaoCustomController.getInstance().setCustomController(MaoCustomController
.Controller customController)
| 方法名 | 简介 | 
|---|---|
| boolean canReadLocation() | 是否允许SDK主动使⽤地理位置信息(true:可以获取,false禁⽌获取。默认为true) | 
| Location getLocation() | 当canReadLocation()==false时,可传⼊地理位置信息,sdk使⽤您传⼊的地理位置信息 | 
| boolean canUsePhoneState() | 是否允许SDK主动使⽤⼿机硬件参数(imei,meid,imsi,iccid),true:可以使⽤,false禁⽌使⽤。默认为true | 
| String getImei() | 当canUsePhoneState()==false时,可传⼊原始的imei信息,sdk使⽤您传的原始imei信息 | 
| String[] getImeis() | 当canUsePhoneState()==false时,可传⼊原始的imei信息(sdk使⽤您传⼊的原始imei信息。传⼊的是数组,imei个数和⼿机卡个数相同) | 
| boolean canUseAndroidId() | 是否允许主动获取AndroidID(true:允许获取,false禁⽌⽤。默认为true) | 
| String getAndroidId() | 当canUsePhoneState()==false时,可传⼊android_id信息(sdk将使⽤您传⼊的android_id) | 
| boolean canUseMacAddress() | 是否允许SDK主动使⽤mac_address(true:允许使⽤,false禁⽌使⽤。默认为true) | 
| String getMacAddress() | 当canUseMacAddress()==false时,可传⼊mac地址信息,sdk使⽤您传⼊的mac地址信息 | 
| boolean canUseOaid() | 是否允许SDK主动使⽤oaid(true:可以使⽤,false禁⽌使⽤。默认为true) | 
| String getOaid() | 当canUseOaid()==false时,可传⼊oaid信息,sdk使⽤您传⼊的oaid信息 | 
| boolean canUseNetworkState() | 是否允许SDK主动使⽤ACCESS_NETWORK_STATE权限(true:可使⽤,false禁⽌使⽤。默认为true) | 
| boolean canUseStoragePermission() | 是否允许SDK主动使⽤存储权限(true:可以使⽤,false禁⽌使⽤。默认为true) | 
| boolean canReadInstalledPackages() | 是否允许SDK主动读取app安装列表(true:可以使⽤,false禁⽌使⽤。默认为true) | 
| public List | 当canReadInstalledPackages()==false 时可传⼊已安装应⽤列表信息(sdk将使⽤您传⼊的已安装应⽤列表) | 
| public canGetSensorManager() | 是否允许SDK主动传感器权限(true:可以使⽤,false禁⽌使⽤。默认为true)) | 
MaoSplashAd对象,避免获取container失败而导致的crash。applicationId修改为 demo 工程的applicationId,并使用demo中的广告位id进行测试。开屏广告MaoSplashAd对象不可以在应用的SplashActivity#onCreate生命周期内直接创建,需要延时1000ms左右再进行new操作,参考代码
  ViewGroup container = (ViewGroup) this.findViewById(R.id.splash_container);
  container.postDelayed(()->{
          MaoSplashAd MaoSplashAd = new MaoSplashAd(this, this, pos_id, 3);
      }, 1000);
提示"开屏广告容器的高度低于400dp"时,需要修改容器的高度大于设备屏幕高度的75%
build.gradle中是否依赖了Mao_kssdk.aarAndroidManifest.xml的<Application>标签下配置android:hardwareAccelerated="true"来开启硬件加速