Android 集成指南


更新日志

版本 修订日期 修订说明
v2.5.02 2025-10-21 1.第三方广告网络SDK更新 2.优化已知问题

1 SDK 接入

1.1 SDK 资源导入

1.1.1 申请应用的 AppID

接入集成可使用以下测试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

1.1.2 导入 aar 及 SDK 依赖的 jar 包

SDK及DEMO下载
将本SDK压缩包内的maosdk_x.x.x.aarmaosdk_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'
}

1.2 AndroidManifest 配置

1.2.1 添加权限

若您的 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" />
1.2.2 运行环境配置

本SDK可运行于 Android5.0 (API Level 21) 及以上版本,请确保build.gradle中的minSdkVersion参数不小于21

1.3 其他配置

1.3.1 注意

1.4 初始化SDK

开发者需要在Application#onCreate方法中调用以下代码来初始化sdk。 目前sdk已支持多进程,如果明确某个进程不会使用到广告sdk,可以只针对特定进程初始化广告sdk。

public class MainApplication extends Application {
    @Override
    public void onCreate(){
        super.onCreate();

        MaoSdk.init(this, "应用ID");
    }
} 

2 加载广告

2.1 接入开屏广告 (MaoSplashAd)

SDK为接入方提供了开屏广告,开屏广告建议为用户在进入App时展示的全屏广告。开屏广告为一个 View ,需要传入一个承载容器 ViewGroup ,宽高默认为 match_parent ,注意开屏广告容器 ViewGroup :width >=70% 屏幕宽,height >=50% 屏幕高,否则会影响计费。

2.1.1 MaoSplashAd 广告说明
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);

}
2.1.2 MaoSplashAdListener 说明
public interface MaoSplashAdListener {

    /**
     * 加载成功
     */
    void onMaoAdLoaded();

    /**
     * 拉取广告超时
     */
    void onMaoAdLoadTimeOut();

    /**
     * 开屏广告展示
     */
    void onMaoAdShow();

    /**
     * 点击
     */
    void onMaoAdClicked();


    /**
     * 倒计时结束
     */
    void onMaoAdTickOver();

    /**
     * 开屏广告关闭
     */
    void onMaoAdDismissed();

    /**
     * 广告错误
     */
    void onMaoAdError(MaoAdError error);
}
2.1.3 加载开屏广告
    MaoSplashAd splashAd = new MaoSplashAd(this, this, "广告位id", 超时时长(int型,单位秒));

    splashAd.fetchAndShowIn(container);

2.2 接入激励视频 (MaoRewardVideoAd)

本SDK为接入方提供激励视频广告,该广告的效果为观看完毕视频广告,发放奖励给用户。使用场景包括但不限于:

2.2.1 MaoRewardVideoAd 广告说明
public class MaoRewardVideoAd{

    public MaoRewardVideoAd(Activity activity, String posId, MaoRewardVideoAdListener adListener);

    /**
     * 设置用户id
     */
    public void setUserId(String userId);

    /**
     * 加载广告
     */
    public void loadAd();

    /**
     * 展示广告
     */
    public void showAD();

}
2.2.2 MaoRewardVideoAdListener 说明
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) ;
}
2.2.3 加载激励视频
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();
    }

2.3 接入插屏广告 (MaoInterstitialAd)

本SDK为接入方提供个性化模板插屏广告,开发者不用自行对广告样式进行编辑和渲染,可直接调用相关接口获取广告 view,广告样式模板以及微调后期支持开发者编辑。

2.3.1 MaoInterstitialAd 广告说明
public class MaoInterstitialAd{

    public MaoInterstitialAd(Activity activity, String posId, MaoInterstitialAdListener adListener);

    public void loadAd();

    public void showAd();
}
2.3.2 MaoInterstitialAdListener 说明
public interface MaoInterstitialAdListener{
    void onMaoAdLoaded();

    void onMaoAdShow();

    void onMaoAdClicked();

    void onMaoAdError(MaoAdError adError);

    void onMaoAdClosed();
}
2.3.3 加载插屏广告
    MaoInterstitialAd interstitialAd = new MaoInterstitialAd(this, "广告位id", this);
    interstitialAd.loadAd();
==================MaoInterstitialAdListener==================
    /**
     * 广告加载成功,可在此回调后进行广告展示
     */
    void onMaoAdLoaded(){
        //展示广告
        interstitialAd.showAd();
    }

2.4 接入Banner广告 (MaoBannerAd)

本SDK为接入方提供个性化模板 Banner 广告,开发者不用自行对广告样式进行编辑和渲染, Banner 广告为一个 View,需要传入一个承载容器 ViewGroup,广告样式模板以及微调后期支持开发者编辑。

2.4.1 MaoBannerAd 广告说明
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);
}
2.4.2 MaoBannerAdListener 说明
public interface MaoBannerAdListener{
    void onMaoAdLoaded();

    void onMaoAdShow();

    void onMaoAdClicked();

    void onMaoAdClosed();

    void onMaoAdError(MaoAdError var1);
}
2.4.3 加载 banner 广告
MaoBannerAd bannerAd = new MaoBannerAd(this, "广告位id", this);
bannerAd.setBannerContainer(bannerContainer);
bannerAd.loadAD();

2.5 接入全屏视频广告 (MaoFullScreenVideoAd)

本SDK为接入方提供全屏视频广告,该广告的效果播放全屏的视频,视频一定时间后可跳过,无需全程观看完。

2.5.1 MaoFullScreenVideoAd 广告说明
public class MaoFullScreenVideoAd{
    public MaoFullScreenVideoAd(Activity activity, String podId, MaoFullScreenVideoAdListener adListener);
    public void loadAD();
    public void showAd();
}
2.5.2 MaoFullScreenVideoAdListener 说明
public interface MaoFullScreenVideoAdListener{

    void onMaoAdLoaded();

    void onMaoAdShow();

    void onMaoAdClicked();

    void onMaoAdError(MaoAdError adError);

    void onMaoAdVideoCached();

    void onMaoAdClosed();

    void onMaoAdVideoComplete();
}
2.5.3 加载全屏视频广告
    MaoFullScreenVideoAd fullScreenVideo = new MaoFullScreenVideoAd(this, "广告位id", this);
    fullScreenVideo.loadAd();
==================MaoInterstitialAdListener==================
    void onMaoAdVideoCached(){
        fullScreenVideo.showAd();
    }

2.6 接入全屏竖版视频流广告 (MaoExpressFeedFullVideo、MaoExpressFeedFullVideoAd)

本SDK为接入方提供全屏竖版视频流广告,该广告适合在全屏竖版视频流中使用,接入方可以控制视频暂停或继续播放,默认视频播放不可干预,视频广告相关配置可以在平台设置。
支持的广告尺寸: 全屏竖版

2.6.1 MaoExpressFeedFullVideoFeed 广告说明
//拉取多个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
}
2.6.2 MaoExpressFeedFullVideoListener 说明
public interface MaoExpressFeedFullVideoListener{
    void onMaoAdError(MaoAdError error);
    void onMaoFeedFullVideoLoad(List<MaoExpressFeedFullVideoAd> ads);
}
2.6.3 加载全屏竖版视频流广告
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);

2.7 接入原生模版信息流广告 (MaoNativeExpressAd)

本SDK为接入方提供原生模版信息流广告。

适用场景:

分类:

2.7.1 MaoNativeExpressAd 广告说明
public class MaoNativeExpressAd{
    public MaoNativeExpressAd(Activity activity, String podId, MaoNativeExpressAdListener adListener, ViewGroup container);
    public void setSize(MaoSize MaoSize);
    public void loadAd();
}
2.7.2 MaoNativeExpressAdListener 说明
public interface MaoNativeExpressAdListener{
    void onMaoAdLoaded();
    void onMaoAdShow();
    void onMaoAdClicked();
    void onMaoAdError(MaoAdError adError);
    void onMaoAdClosed();
}
2.7.3 加载原生模版信息流广告
MaoNativeExpressAd nativeExpressAd = new MaoNativeExpressAd(this, "广告位id", this, adContainer);
nativeExpressAd.setSize(new MaoSize(width, 0)); //width单位为dp,height=0为自适应高度
nativeExpressAd.loadAd();

2.8 接入原生模板信息流列表 (MaoNativeExpressAdList)

本SDK为接入方提供原生模版信息流列表广告,用于将信息流广告插入列表的场景。

2.8.1 MaoNativeExpressAdList 说明
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);

}
2.8.2 MaoNativeExpressAdListListener 说明
public interface MaoNativeExpressAdListListener {
    
    /**
     * 加载成功
     */
    void onMaoNativeExpressAd(List<MaoNativeAd> ads);

    /**
     * 加载失败
     */
    void onMaoAdError(MaoAdError error);
}
2.8.3 加载原生模板信息流列表
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);
            }
}

2.9 接入原生自渲染广告 (MaoNativeAd)

前文介绍的 Banner 广告、插屏广告等,app会“收到”一个完整的 view 对象,开发者无法自定义广告 view 内部的组件布局(文字 TextView 、图片 ImageView ),而原生广告自渲染方式支持开发者自由拼合这些素材,最大程度的满足开发需求;与原生广告(模板方式)相比,自渲染方式更加自由灵活,开发者可以使用其为开发者的应用打造自定义的布局样式。

前提条件:

适用场景:

使用自渲染 2.0 API拉取到的广告数据主要包含如下字段:

2.9.1 MaoNativeAd、MaoNativeAdData、MaoNativeAdContainer 说明
//负责加载
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" />
    ........
2.9.2 MaoNativeAdListener 说明
public interface MaoNativeAdListener {
    void onMaoNativeAdLoaded(MaoNativeAdData adData);
    void onMaoAdError(MaoAdError adError);
}
2.9.3 加载原生自渲染广告
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();

2.10 接入视频列表内容页 (MaoContentAd)

提供一个视频内容频道供接入方接入,支持上下滑动切换视频内容。
前提条件:
(1)要支持androidx
(2)需要support-v4androidx.legacy:legacy-support-v4

2.10.1 MaoContentAd 说明
public class MaoContentAd{
    public MaoContentAd(Activity activity, MaoContentAdListener adListener, String posId);
    public void showAd(int layoutId);
    public void hideAd();
}
2.10.2 MaoContentAdListener 说明
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);
}
2.10.3 加载视频列表内容页广告
MaoContentAd contentAd = new MaoContentAd(this, this, "广告位id");
contentAd.showAd(R.id.main_container);

3 接入H5内容页

3.1 接入H5内容 (MaoH5Ad)

SDK为接入方提供了定制H5内容页:游戏,测试,积分消耗...

3.1.1 MaoH5Ad、MaoUser说明
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);
}
3.1.2 MaoH5ContentListener 说明
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);
}
3.1.3 加载H5内容页
//deviceId:android10以下传imei,10以上传oaid
MaoUser Maouser = new MaoUser("userID", "userName", "avatarUrl", (int) userIntegral, "deviceId");

MaoH5Ad h5Ad = new MaoH5Ad(activity, Maouser, MaoH5ContentListener, "广告位id");

重写加载MaoH5AdactivityonDestroy方法

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

4 配置隐私权限

开发者如果需要配置隐私权限开关,则需要在每次初始化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 getInstalledPackages() 当canReadInstalledPackages()==false 时可传⼊已安装应⽤列表信息(sdk将使⽤您传⼊的已安装应⽤列表)
public canGetSensorManager() 是否允许SDK主动传感器权限(true:可以使⽤,false禁⽌使⽤。默认为true))

5 常见问题

1. support-v4 包依赖
2. 权限申请与开屏广告
3. 接入过程中测试接口
4. 电话权限、定位权限与外部存储权限申请
5. 开屏广告加载失败或闪退
6. 出现错误 java.lang.ClassNotFoundException: Didn't find class "com.kwad.sdk.api.SdkConfig$Builder
7. 开屏广告显示不完整
8. 激励视频显示黑屏
9. 视频列表内容页加载崩溃
10. 报错 java.lang.NoSuchFieldException: No field mMaxHeight in class Landroid/widget/ImageView;
11. H5任务页无法获取到任务
12. 激励视频播放时报错 android.content.res.Resources&NotFoundException: String resource ID #0x0

1 SDK 接入

1.1 SDK 资源导入

1.2 AndroidManifest 配置

1.3 其他配置

2 加载广告

2.1 接入开屏广告 (MaoSplashAd)

2.2 接入激励视频 (MaoRewardVideoAd)

2.3 接入插屏广告 (MaoInterstitialAd)

2.4 接入Banner广告 (MaoBannerAd)

2.5 接入全屏视频广告 (MaoFullScreenVideoAd)

2.6 接入全屏竖版视频流广告 (MaoExpressFeedFullVideo、MaoExpressFeedFullVideoAd)

2.7 接入原生模版信息流广告 (MaoNativeExpressAd)

2.8 接入原生模板信息流列表 (MaoNativeExpressAdList)

2.9 接入原生自渲染广告 (MaoNativeAd)

2.10 接入视频列表内容页 (MaoContentAd)

3 接入H5内容页

3.1 接入H5内容 (MaoH5Ad)