Android 集成指南


更新日志

版本 修订日期 修订说明
v2.4.11 2024-10-24 1.第三方广告网络SDK更新 2.优化双11预算

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
其他 沟通索取

如对接上有任何技术或运营规则问题可以联系相关人员,微信:liangaxybz,QQ:22770670

1.1.2 导入 aar 及 SDK 依赖的 jar 包

SDK及DEMO下载
将本SDK压缩包内的sjm_sdk_x.x.x.aarsjm_kssdk_x.x.x.aar复制到Application Module/libs文件夹(没有的话须手动创建), 并将以下代码添加到您Application Module的build.gradle

repositories {
    flatDir {
        dirs 'libs'
    }
}


depedencies {
    implementation(name: 'sjm_sdk_x.x.x', ext: 'aar')
    implementation(name: 'sjm_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();

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

2 加载广告

2.1 接入开屏广告 (SjmSplashAd)

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

2.1.1 SjmSplashAd 广告说明
public class SjmSplashAd {

    /**
     * @param activity 
     * @param adListener
     * @param posId 广告位id
     * @param fetchTimeOut 广告时长
     */
    public SjmSplashAd(Activity activity, SjmSplashAdListener adListener, String posId, int fetchTimeOut)
    
    /**
     * 设置开屏广告事件
     */
    public void setAdListener(SjmSplashAdListener adListener);

    public void fetchAndShowIn(ViewGroup adContainer);

}
2.1.2 SjmSplashAdListener 说明
public interface SjmSplashAdListener {

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

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

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

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


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

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

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

    splashAd.fetchAndShowIn(container);

2.2 接入激励视频 (SjmRewardVideoAd)

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

2.2.1 SjmRewardVideoAd 广告说明
public class SjmRewardVideoAd{

    public SjmRewardVideoAd(Activity activity, String posId, SjmRewardVideoAdListener adListener);

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

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

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

}
2.2.2 SjmRewardVideoAdListener 说明
public interface SjmRewardVideoAdListener{
    /**
     * 每次广告加载成功,会在此回调生生成一个唯一的tradeid
     */
    void onSjmAdTradeId(String tradeid, String tradeKey, String isVerify);

    /**
     * 视频素材缓存成功,可在此回调后进行广告展示
     */
    void onSjmAdLoaded(String adid);

    /**
     * 视频素材缓存成功,可在此回调后进行广告展示
     */
    void onSjmAdVideoCached();

    /**
     * 激励视频广告页面展示
     */
    void onSjmAdShow();

    /**
     * 广告展示出错
     */
    void onSjmAdShowError(SjmAdError adError);

    /**
     * 激励视频广告被点击
     */
    void onSjmAdClick();

    /**
     * 激励视频播放完毕
     */
    void onSjmAdVideoComplete();

    /**
     * 激励视频广告曝光
     */
    void onSjmAdExpose();

    /**
     * 激励视频触发激励(观看视频大于一定时长或者视频播放完毕)
     */
    void onSjmAdReward(String adid) ;

    /**
     * 激励视频广告被关闭
     */
    void onSjmAdClose() ;

    /**
     * 广告流程出错
     */
    void onSjmAdError(SjmAdError adError) ;
}
2.2.3 加载激励视频
SjmRewardVideoAd rewardVideoAD = new SjmRewardVideoAd(this, "广告位id", this);

rewardVideoAD.setUserId("自身应用当前的userid"); 
rewardVideoAD.setRewardName("积分奖励");    //激励奖励名称
rewardVideoAD.setRewardAmount(1);   //激励奖励数
rewardVideoAD.setExtra("extStr");   //拓展参数
rewardVideoAD.loadAd();
==================SjmRewardVideoAdListener==================
    /**
     * 广告加载成功
     **/
    @Override
    public void onSjmAdLoaded(String adId){
        adLoaded = true;
        showStatus("onSjmAdLoad:广告加载成功");
    }

    /**
    * 视频素材缓存成功,可在此回调后进行广告展示
    */
    @Override
    public void onSjmAdVideoCached(){
        videoCached = true;
        showStatus("onSjmAdVideoCached:视频素材缓存成功,可在此回调后进行广告展示");
        //可以展示,视频已经缓存,展示没有进度条
        rewardVideoAD.showAD();
    }

2.3 接入插屏广告 (SjmInterstitialAd)

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

2.3.1 SjmInterstitialAd 广告说明
public class SjmInterstitialAd{

    public SjmInterstitialAd(Activity activity, String posId, SjmInterstitialAdListener adListener);

    public void loadAd();

    public void showAd();
}
2.3.2 SjmInterstitialAdListener 说明
public interface SjmInterstitialAdListener{
    void onSjmAdLoaded();

    void onSjmAdShow();

    void onSjmAdClicked();

    void onSjmAdError(SjmAdError adError);

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

2.4 接入Banner广告 (SjmBannerAd)

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

2.4.1 SjmBannerAd 广告说明
public class SjmBannerAd{
    public SjmBannerAd(Activity activity, String posId, SjmBannerAdListener adListener);
    public SjmBannerAd(Activity activity, String posId, SjmBannerAdListener adListener, ViewGroup container);
    public void loadAD()
    //在loadAd前设置
    public void setBannerContainer(ViewGroup container);
}
2.4.2 SjmBannerAdListener 说明
public interface SjmBannerAdListener{
    void onSjmAdLoaded();

    void onSjmAdShow();

    void onSjmAdClicked();

    void onSjmAdClosed();

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

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

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

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

    void onSjmAdLoaded();

    void onSjmAdShow();

    void onSjmAdClicked();

    void onSjmAdError(SjmAdError adError);

    void onSjmAdVideoCached();

    void onSjmAdClosed();

    void onSjmAdVideoComplete();
}
2.5.3 加载全屏视频广告
    SjmFullScreenVideoAd fullScreenVideo = new SjmFullScreenVideoAd(this, "广告位id", this);
    fullScreenVideo.loadAd();
==================SjmInterstitialAdListener==================
    void onSjmAdVideoCached(){
        fullScreenVideo.showAd();
    }

2.6 接入全屏竖版视频流广告 (SjmExpressFeedFullVideo、SjmExpressFeedFullVideoAd)

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

2.6.1 SjmExpressFeedFullVideoFeed 广告说明
//拉取多个SjmExpressFeedFullVideoAd(1-3)
public class SjmExpressFeedFullVideo{
    public SjmExpressFeedFullVideo(Activity activity, String posId, SjmExpressFeedFullVideoListener adListener);
    public SjmExpressFeedFullVideo(Activity activity, String posId, SjmSize viewSize, SjmExpressFeedFullVideoListener adListener)
    public void loadAd();
    public void loadAd(int count);  //count取值范围1-3
}
2.6.2 SjmExpressFeedFullVideoListener 说明
public interface SjmExpressFeedFullVideoListener{
    void onSjmAdError(SjmAdError error);
    void onSjmFeedFullVideoLoad(List<SjmExpressFeedFullVideoAd> ads);
}
2.6.3 加载全屏竖版视频流广告
SjmSize size = new SjmSize(1080, 1920);//size参数大小单位是dp
SjmExpressFeedFullVideo expressFullVideoFeed = new SjmExpressFeedFullVideo(this, "广告位id", size, new SjmExpressFeedFullVideoListener(){
    @Override
    public void onSjmAdError(SjmAdError error){
        Log.d("test", "SjmExpressFullVideoFeed2.onSjmAdError=" + error.getErrorMsg());
    }

    @Override
    public void onSjmFeedFullVideoLoad(List<SjmExpressFeedFullVideoAd> ads){
        Log.d("test", "SjmExpressFeedFullVideo.onSjmFeedFullVideoLoad");
    }
expressFullVideoFeed.loadAd(1);

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

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

适用场景:

分类:

2.7.1 SjmNativeExpressAd 广告说明
public class SjmNativeExpressAd{
    public SjmNativeExpressAd(Activity activity, String podId, SjmNativeExpressAdListener adListener, ViewGroup container);
    public void setSize(SjmSize SjmSize);
    public void loadAd();
}
2.7.2 SjmNativeExpressAdListener 说明
public interface SjmNativeExpressAdListener{
    void onSjmAdLoaded();
    void onSjmAdShow();
    void onSjmAdClicked();
    void onSjmAdError(SjmAdError adError);
    void onSjmAdClosed();
}
2.7.3 加载原生模版信息流广告
SjmNativeExpressAd nativeExpressAd = new SjmNativeExpressAd(this, "广告位id", this, adContainer);
nativeExpressAd.setSize(new SjmSize(width, 0)); //width单位为dp,height=0为自适应高度
nativeExpressAd.loadAd();

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

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

2.8.1 SjmNativeExpressAdList 说明
public class SjmNativeExpressAdList{

    public SjmNativeExpressAdList(Activity activity, String posId, SjmNativeExpressAdListListener adListener);

    /**
     * 信息流内容为视频时是否开启视频声音
     */
    public void setAutoPlay(boolean volumeOn);

    /**
     * 设置广告的尺寸,单位为DP
     */
    public void setSize(SjmSize SjmSize);

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

}
2.8.2 SjmNativeExpressAdListListener 说明
public interface SjmNativeExpressAdListListener {
    
    /**
     * 加载成功
     */
    void onSjmNativeExpressAd(List<SjmNativeAd> ads);

    /**
     * 加载失败
     */
    void onSjmAdError(SjmAdError error);
}
2.8.3 加载原生模板信息流列表
SjmNativeExpressAdList expressAdList = new SjmNativeExpressAdList(this, "posId", new SjmNativeExpressAdListListener() {
            @Override
            public void onSjmNativeExpressAd(List<SjmNativeAd> adList) {
                if (mRecyclerView != null) {
                    mRecyclerView.setLoadingFinish();
                }
                if (adList == null || adList.isEmpty()) {
                    return;
                }

                int totalCount = mFeedList.size();
                for (SjmNativeAd SjmNativeAd : adList) {
                    if (SjmNativeAd == null) {
                        continue;
                    }
                    mFeedList.add(mFeedList.size(), new TestBean(SjmNativeAd, FeedRecyclerAdapter.ItemViewType.ITEM_VIEW_TYPE_AD));
                }
                mFeedRecyclerAdapter.notifyDataSetChanged();
            }

            @Override
            public void onSjmAdError(SjmAdError error) {
                if (mRecyclerView != null) {
                    mRecyclerView.setLoadingError();
                }
            }

        });
        expressAdList.setAutoPlay(true);
        expressAdList.setSize(new SjmSize(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 SjmNativeAd SjmNativeAd = (SjmNativeAd) mDataList.get(position).object;
                // 设置监听
                SjmNativeAd.setExpressInteractionListener(new SjmNativeAd.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, SjmAdError error) {

                    }
                });
                SjmNativeAd.render(adViewHolder.mAdContainer);
            }
}

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

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

前提条件:

适用场景:

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

2.9.1 SjmNativeAd、SjmNativeAdData、SjmNativeAdContainer 说明
//负责加载
public class SjmNativeAd{
    public SjmNativeAd(Activity activity, String posId, SjmNativeAdListener adListener);
    public void loadAd();
}
//广告数据
public class SjmNativeAdData {

    /**
     * 将布局与广告进行绑定
     */
    public void bindAdToView(Context context, SjmNativeAdContainer container, FrameLayout.LayoutParams layoutParams, List<View> views);

    /**
     * 将布局与视频组件MediaView进行绑定
     */
    public void bindMediaView(SjmMediaView mediaView, SjmNativeAdMediaListener adListener);

    /**
     * 设置回调
     */
    public void setNativeAdEventListener(SjmNativeAdEventListener eventListener);

    /**
     * 获取广告标题,短文字
     */
    public String getTitle();

    /**
     * 获取广告描述,长文字
     */
    public String getDesc();

    /**
     * 获取Icon 图片地址
     */
    public String getIconUrl();

    /**
     * 获取大图地址
     */
    public String getImgUrl();

    /**
     * 获取广告样式
     * @see com.Sjm.Sjmsdk.ad.SjmAdPatternType
     */
    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.Sjm.Sjmsdk.ad.natives.SjmNativeAdContainer
    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 SjmNativeAdListener 说明
public interface SjmNativeAdListener {
    void onSjmNativeAdLoaded(SjmNativeAdData adData);
    void onSjmAdError(SjmAdError adError);
}
2.9.3 加载原生自渲染广告
SjmNativeAd nativeAd = new SjmNativeAd(this, "广告位id", new SjmNativeAdListener() {
            @Override
            public void onSjmNativeAdLoaded(SjmNativeAdData SjmNativeAdData) {
                this.adData = SjmNativeAdData;
                renderAdUi(adData);
                bindAdEvent(adData);
            }

            @Override
            public void onSjmAdError(SjmAdError SjmAdError) {
                showError("onSjmAdError", SjmAdError.getErrorCode(), SjmAdError.getErrorMsg());
            }
        });
        nativeAd.loadAd();

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

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

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

3 接入H5内容页

3.1 接入H5内容 (SjmH5Ad)

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

3.1.1 SjmH5Ad、SjmUser说明
public class SjmUser{
    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 SjmUser(String userID, String userName, String userAvatar, int userIntegral)
    public SjmUser(String userID, String userName, String userAvatar, int userIntegral, String deviceId)
}
public class SjmH5Ad{
    public SjmH5Ad(Activity activity, SjmUser SjmUser, SjmH5ContentListener adListener, String posId);
}
3.1.2 SjmH5ContentListener 说明
public interface SjmH5ContentListener {
    /**
     * 积分不够
     */
    void onIntegralNotEnough(SjmUser user, int needIntegral);
    /**
     * 积分消耗
     *  expendIntegral>0,用户消耗了多少积分
     *  expendIntegral<0,用户任务完成领取了多少积分
     */
    void onIntegralExpend(SjmUser user, int expendIntegral);
    /**
     * 返回的是完成的任务总数
     */
    void onFinishTasks(SjmUser user, int finishTasks);
    /**
     * 退出H5
     */
    void onGameExit(SjmUser user);
    /**
     * 看广告奖励触发,此接口是完成总任务数返回的奖励接口
     */
    void onSjmAdReward(SjmUser user, int rewardIntegral);
    /**
     * h5页面中激励视频触发激励(观看视频大于一定时长或者视频播放完毕)
     */
    void onSjmAdReward(String adId);
    /**
     * h5页面中观看激励视频时视频加载成功的返回事件
     */
    void onSjmAdLoaded(String adId);
    /**
     * 每次广告加载成功,会在此回调生成一个唯一的广告id
     */
    void onSjmAdTradeId(String trade_id);
    /**
     * h5页面中观看激励视频时的点击广告的返回事件
     */
    void onSjmAdClick();
    /**
     * 用户页面的行为操作
     *  joinLottery --> 参与抽奖
     *  joinSurvey --> 参与测一测
     *  joinGuessingIdioms --> 参与猜成语
     *  stay60s --> 咨询浏览超过60s的回调
     *  joinGame --> 参与游戏
     *  taskSignIn --> 签到成功
     */
    void onSjmUserBehavior(String behavior);
}
3.1.3 加载H5内容页
//deviceId:android10以下传imei,10以上传oaid
SjmUser Sjmuser = new SjmUser("userID", "userName", "avatarUrl", (int) userIntegral, "deviceId");

SjmH5Ad h5Ad = new SjmH5Ad(activity, Sjmuser, SjmH5ContentListener, "广告位id");

重写加载SjmH5AdactivityonDestroy方法

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

4 配置隐私权限

开发者如果需要配置隐私权限开关,则需要在每次初始化SDK前调⽤SjmCustomController.getInstance().setCustomController(SjmCustomController
.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 接入开屏广告 (SjmSplashAd)

2.2 接入激励视频 (SjmRewardVideoAd)

2.3 接入插屏广告 (SjmInterstitialAd)

2.4 接入Banner广告 (SjmBannerAd)

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

2.6 接入全屏竖版视频流广告 (SjmExpressFeedFullVideo、SjmExpressFeedFullVideoAd)

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

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

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

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

3 接入H5内容页

3.1 接入H5内容 (SjmH5Ad)