1

趣盟 Android SDK 接入文档

广告 SDK 说明:

一、导入SDK依赖

1.1 本地aar依赖

  1. 在 app 目录下新建 libs 文件夹

  2. 将压缩包中的 aar 文件放入 libs 文件夹

  3. 在 app/build.gradle 添加如下代码

    repositories {
        flatDir {
            dirs 'libs'
        }
    }
    
    dependencies {
        api(name: 'aar文件名', ext: 'aar')
    }
    

1.2 AndroidManifest 配置

<uses-permission android:name="android.permission.INTERNET" />
<!-- 可选 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> //targetApi 33以上,使用通知需要增加这个权限

1.3 混淆配置

详情可参考aar中proguard.txt文件(直接依赖aar不需要单独处理,如果存在单独打包需要注意)

-dontwarn com.qumeng.advlib.**
-dontwarn com.miui.externalserver.**
-dontwarn com.jifen.open.**
-dontwarn com.inno.innosdk.*.**

-keep class com.qm.advlib.trdparty.secure.**{*;}
-keep class com.qm.advlib.trdparty.identifier.** {*;}
-keep class com.inno.*.** {*;}
-keep class com.qumeng.advlib** {*;}
-keep class qm.qm** {*;}
-keep class com.alipay.sdk** {*;}
-keep class com.bun.miitmdid.core.MdidSdkHelper**{*;}
-keep class com.bun.miitmdid.interfaces.IIdentifierListener**{*;}
-keep class com.bun.supplier.IIdentifierListener**{*;}

-keepclassmembers class * {
            native <methods>;
}

##必须要添加,androidx & support依赖移除适配
-keep public class * extends com.qumeng.advlib.__remote__.utils.androidx.**
-keep class com.qumeng.advlib.__remote__.utils.androidx.**{*;}

-keep class com.qumeng.advlib.__remote__.ui.incite.feedexpree.bxw.StatsHelper{
    public <methods>;
}
-keepclassmembers class com.qumeng.advlib.__remote__.ui.incite.feedexpree.bxw.StatsHelper$DeviceInfo {
    <fields>;
}

注意事项:

如果 tools.build:gradle 版本小于 4.1.0,请检查自定义混淆规则或 proguard-android-optimize,确认混淆规则中没有使用 -allowaccessmodification 属性

3.479增加如下混淆规则

 -keep class com.qm.advlib.trdparty.secure.**{*;} 
 -keep class com.qm.advlib.trdparty.identifier.** {*;}

1.4 FileProvider 配置

<provider
    android:name="com.qumeng.advlib.core.CPCFileProvider"
    android:authorities="${applicationId}.CPCFileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/cpc_external_files" />
</provider>

cpc_external_files配置内容如下:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <!--Android/data/包名/目录-->
    <external-path name="external_files" path="."/>
    <!-- 内部文件目录 -->
    <files-path name="internal_files" path="."/>

    <!-- 内部缓存目录 -->
    <cache-path name="internal_cache" path="."/>
</paths>

二、配置相关

2.1 初始化SDK

必须在用户同意隐私政策后,再初始化SDK

AiClkAdManager为单例,会做一些初始化工作,需要传入一个Context对象

AiClkAdManager.getInstance().init(new QMConfig.Builder()
        .build(this));

2.2 隐私信息控制开关

public abstract class QMCustomControl {
  
   /**
    * 是否允许SDK主动获取安装列表
    * @return 默认false 不允许 , true 允许
    */
   public boolean isCanUseAppList() {
      return false;
   }


   /**
    * 当isCanUseAppList=false时,可传入applist信息,sdk使用您传入的applist信息
    * @return true可以使用,false禁止使用。默认为true
    */
   public List<PackageInfo> getAppList() {
      return null;
   }

   /**
    *  开发者可以传入oaid 仅初始化调用一次
    *  信通院OAID的相关采集——如何获取OAID:
    1. 移动安全联盟官网http://www.msa-alliance.cn/
    2. 信通院统一SDK下载http://msa-alliance.cn/col.jsp?id=120
    *  如果首次传入为null,后续可以通过JFIdentifierManager.getInstance().setOaid(String oaid)方式传入oaid
    * @return oaid 
    */
   public String getOaid() {
      return null;
   }
  
   /**
     * 3.462.15.428版本
     * 媒体主动传入oaid,则优先使用媒体方的oaid,未传入oaid时通过该开关控制是否允许SDK主动获取oaid
     * @return 默认true 允许 , false 不允许
     */
    public boolean isCanUseOaid() {
        return true;
    }
  
  /**
   * aar版本大于等于3.468.11.434 且仅对小米设备生效,其他设备默认获取
     * 是否允许SDK主动获取Boot ID
     * @return true 允许 , false 不允许  默认false  
     */
    public boolean isCanUseBootId() {
        return false;
    }
  
  /**
   * aar版本大于等于3.469.13.435版本支持 
   * map方式传入自定义设置
   * 当前支持传入fileProviderAuthority,如果媒体传入了的情况下,优先使用媒体传入的fileprovider,
   * 该情况下可删除趣盟Manifest中 com.qumeng.advlib.core.CPCFileProvider的配置,
   * 但是需要在媒体的provider中配置趣盟所需的<paths>
   * 传入方式:参考示例
   */
  @Override
  public Map<String, Object> getCustomConfig() {
      return null;
  }
  
}

示例:

AiClkAdManager.getInstance().init(new QMConfig.Builder()
        .customControl(new QMCustomControl() {
           @Override
           public Map<String, Object> getCustomConfig() {
               Map<String,Object> map = new HashMap<>();
               map.put("FileProviderAuthority","媒体的FileProvider");
               return map;
           }
        })
        .build(this));

2.3 个性化设置

3.455.10.420新增推荐广告开关

 /**
      * 设置个性化推荐广告
      * true:允许个性化推荐广告  false:屏蔽个性化推荐广告
      */
void setPersonalRecommend(boolean enable)

3.469.13.435新增摇一摇开关(传感器信息使用)

 /**
      * 设置个性化摇一摇开关(是否允许使用传感器)
      * true:允许摇一摇广告  false:不允许摇一摇广告
      */
void setTwistSwitch(boolean enable)

示例:

AiClkAdManager.getInstance().setPersonalRecommend(true) //默认true 允许个性化推荐广告
AiClkAdManager.getInstance().setTwistSwitch(true);//默认true 允许摇一摇广告

2.4 通用接口说明

接口IMultiAdObject说明

方法名 意义 备注
getRequestId() 广告唯一id 3.464.15.430开始支持
getECPM() 广告价格 单位分;
isValid() 广告有效性判断 通过isValid()方法可以判断广告是否有效,无效广告将不计入展点消数据;3.472.10.438版本开始支持
getQMLogo() 趣盟logo图片链接
getAppInformation() 广告六要素信息 一般用于下载合规外显,信息包括应用版本、开发者信息、隐私协议链接、应用权限链接、应用功能链接
getExtraInfo() 获取扩展信息 返回值:Map<String, Object>
destroy() 释放广告资源
getMediaExtraInfo 获取媒体拓展信息 3.479版本开始支持
返回值:Map<String, Object>
当price_type字段值为0时,price字段返回CPM计费价格,单位分
当price_type字段值为1时,price字段返回CPC计费价格,单位分

2.5 接入注意事项

1、广告无效:通过isValid()方法可以判断广告是否有效,无效广告将不计入展点消数据

三、信息流广告

3.1 请求广告

通过管理类构造请求对象-AdRequest

IMultiAdRequest request = AiClkAdManager.getInstance().createAdRequest();

构造请求参数-AdRequestParam

AdRequestParam requestParam = new AdRequestParam.Builder()
        .adslotID("9004885")//栏位id
         .adType(AdRequestParam.ADTYPE_FEED)//广告类型:信息流
        .extraBundle(bundle)//扩展字段
        .adLoadListener(new AdRequestParam.ADLoadListener() {
                @Override
                public void onADLoaded(IMultiAdObject adModel) {

                }

                @Override
                public void onAdFailed(String errorMsg) {
                Log.i("aiclk", "onAdFailed:" + errorMsg);
        }
        })
        .build();

请求广告

if (multiAdRequest != null) {
        multiAdRequest.invokeADV(requestParam);
}

3.2 展示广告

3.2.1 自渲染示例

onADLoaded回调得到的对象IMultiAdObject。

注意

①如果有渲染合规前置,点击创意区域直接下载(无二次确认弹窗),请使用bindEvent(ViewGroup adContainer, List clickViews, List creativeViews, ADEventListener listener) 将创意区域的view传入。

代码示例:

if (adModel != null && adModel.isValid()) {
        String title = adModel.getTitle();//获取广告标题
        List<String> urls = adModel.getImageUrls();//获取广告图片
        int price = adModel.getECPM();/获取广告价格
        Pair<Integer,Integer> mediaSize = adModel.getMediaSize();//获取素材大小
        int materialType = adModel.getMaterialType();//获取广告物料类型
        View videoView = adModel.getVideoView(adContent.getContext());//获取视频播放器控件
        adModel.bindEvent(adContent, Arrays.asList((View)imageView)
                ,new IMultiAdObject.ADEventListener() {//绑定广告事件
                        @Override
                        public void onAdClick() {
                                Log.i("aiclk","onAdClick... ...");//广告点击
                        }

                        @Override
                        public void onADExposed() {
                                Log.i("aiclk","onADExposed... ...");//广告展现
                        }

                        @Override
                        public void onAdFailed(String errorMsg) {
                                Log.i("aiclk","onAdFailed... ...");
                        }
        });
}

3.2.2 模板渲染示例

onADLoaded回调得到的对象IMultiAdObject。

代码示例:

if (adModel != null && adModel.isValid()) {
    //必须在bindView之前设置
    adModel.setADStateListener(new IMultiAdObject.ADStateListener() {
       @Override
       public void onAdEvent(int eventType, @NonNull Bundle data) {
          Log.i("aiclk", "eventType = " + eventType);
          if (eventType == ADEvent.EVENT_AD_CLOSE) {
             //客户端处理
             Toast.makeText(FeedAdActivity.this, "广告关闭回调", Toast.LENGTH_SHORT).show();
          }
       }
    });
    adModel.bindView(adTemplateContent, new IMultiAdObject.ADEventListener() {
       @Override
       public void onAdClick() {
          Log.i("aiclk", "onAdClick");
          Toast.makeText(FeedAdActivity.this, "广告点击", Toast.LENGTH_SHORT).show();
       }

       @Override
       public void onADExposed() {
          Log.i("aiclk", "onAdShow");
          Toast.makeText(FeedAdActivity.this, "广告展现", Toast.LENGTH_SHORT).show();
       }

       @Override
       public void onAdFailed(String errorMsg) {
          Log.i("aiclk", "onAdFailed: " + errorMsg);
          Toast.makeText(FeedAdActivity.this, "广告失败", Toast.LENGTH_SHORT).show();
       }
    });
}

3.3 信息流广告下载监听

广告下载事件监听(3.456及以上版本支持)

//下载监听设置
adModel.setDownloadListener(new IAppDownloadListener() {
        /**
     * 未开始下载
     */
        @Override
        public void onIdle() {
        }
  
        /**
     * 下载中回调
     * @param totalBytes 安装包总字节数 -1 :未知
     * @param currBytes 当前已下载的字节数
     * @param appName 当前下载的APP名
     */
        @Override
        public void onDownloadActive(long totalBytes, long currBytes, String appName) {
        }
  
        /**
     * 下载暂停回调
     * @param totalBytes 安装包总字节数 -1 :未知
     * @param currBytes 当前已下载的字节数
     * @param appName 当前下载的APP名
     */
        @Override
        public void onDownloadPaused(long totalBytes, long currBytes, String appName) {
        }
  
        /**
     * 下载失败回调
     */
        @Override
        public void onDownloadFailed() {
                creativeBtn.setText("下载失败");
        }
  
        /**
     * 下载完成回调
     * @param appName 当前下载的APP名
     */
        @Override
        public void onDownloadCompleted(String appName) {
                creativeBtn.setText("安装应用");
        }
  
        /**
     * 安装完成回调
     * @param appName 当前下载的APP名
     */
        @Override
        public void onInstalled(String appName) {
                creativeBtn.setText("立即体验");
        }
});

3.4 接口说明

接口IMultiAdObject说明

常量名 值 意义
MATERIAL_TYPE_SMALL_IMAGE 1 小图
MATERIAL_TYPE_BIG_IMAGE 2 大图
MATERIAL_TYPE_GROUP_IMAGE 3 组图
MATERIAL_TYPE_VIDEO_H 4 横版视频
MATERIAL_TYPE_SPLASH 6 开屏
MATERIAL_TYPE_VIDEO_V 9 竖版视频
方法名 意义 备注
getRequestId() 广告唯一id 3.464.15.430开始支持
getTitle() 广告标题
getDesc() 广告副标题
getLandingPageUrl() 落地页地址
getInteractionType() 广告交互类型 INTERACTION_TYPE_LANDPAGE=1;
落地页类型
INTERACTION_TYPE_DOWNLOAD=2;
下载类型(包含拉新和拉活)
getImageUrls() 广告图片链接
getAppLogoUrl() 广告创意logo
getAppName() 广告创意应用名称
getAppPackageName() 广告创意包名
getMediaSize() 素材宽高 图片或者视频的宽高。
first为宽,second为高
getMaterialType() 广告物料的类型 1:小图
2:大图
3:组图
4:横版视频
6:开屏
9:竖版视频
getVideoView(Context) 获取播放器组件 context传入view.getContext()
getTwistView(Context) -- 3.474版本起废弃 获取摇一摇组件 context传入view.getContext()
bindEvent(ViewGroup,List, IMultiAdObject.ADEventListener) 信息流绑定广告事件 adContainer:广告容器
clickViews:可点击的View的列表
listener:广告事件回调
bindEvent(ViewGroup adContainer
, List clickViews
, List creativeViews
, ADEventListener listener)
信息流绑定广告事件 adContainer:广告容器
clickViews:可点击的View的列表
creativeViews:用于下载的View
listener:广告事件回调
setOnMediaStateListener
(IMultiAdObject.MediaStateListener)
设置视频回调 在调用渲广告展示之前设置
getVideoDuration() 视频播放时长
setDownloadListener() 设置广告下载事件监听

视频状态监听 IMultiAdObject.MediaStateListener 接口说明:

方法名 含义
onVideoReady() 视频播放准备
onVideoStart() 视频播放开始
onVideoPause() 视频播放暂停
onVideoResume() 视频播放继续
onVideoCompleted() 视频播放完成
onVideoStop() 视频播放停止

四、激励视频

4.1 广告请求加载

首先请求广告物料,请求方式和信息流基本一样。请注意,adType为ADTYPE_REWARD_VIDEO

AdRequestParam requestParam = new AdRequestParam.Builder()
        .adslotID("7124677")  //必选
        .adType(AdRequestParam.ADTYPE_REWARD_VIDEO) //必选,请注意:adType为ADTYPE_REWARD_VIDEO
        .extraBundle(bundle)//扩展字段
        .adLoadListener(new AdRequestParam.ADLoadListener() { //必选,加载监听
@Override
public void onADLoaded(IMultiAdObject object) {
        Log.e(TAG, "onADLoaded");
        }

@Override
public void onAdFailed(String errorMsg) {
        Log.e(TAG, "onAdFailed:" + errorMsg);
        }
        })
        .build();
        IMultiAdRequest multiAdRequest = AiClkAdManager.getInstance().createAdRequest();
        if (multiAdRequest != null) {
        multiAdRequest.invokeADV(requestParam);
        }

onADLoaded回调得到的对象IMultiAdObject,启动激励视频界面

if (object != null && object.isValid()) {
        object.showRewardVideo(MainActivity.this,new AdRequestParam.ADRewardVideoListener() {//必选,激励视频回调监听
@Override
public void onAdShow(Bundle bundle) {
        Log.i("aiclk",TAG + ":onAdShow");//广告展示
        }

@Override
public void onAdClick(Bundle bundle) {
        Log.i("aiclk",TAG + ":onAdClick");//广告点击
        }

@Override
public void onAdClose(Bundle bundle) {
        Log.i("aiclk",TAG + ":onAdClose");//激励视频页面关闭
        }

@Override
public void onVideoComplete(Bundle bundle) {
        Log.i("aiclk",TAG + ":onVideoComplete");//激励视频播放完成
        }

@Override
public void onVideoError(Bundle bundle) {
        Log.i("aiclk",TAG + ":onVideoError");//激励视频播放失败
        }

@Override
public void onReward(Bundle bundle) {
        Log.i("aiclk",TAG + ":onReward");//激励视频领取奖励
        }

@Override
public void onSkippedVideo(Bundle bundle) {
        Log.i("aiclk",TAG + ":onSkippedVideo");//激励视频跳过,提前点击关闭
        }
});
}

4.2 文案定制

根据业务特殊需求,可在请求时传入扩展字段extraBundle,比如:

JSONObject jsonObject = new JSONObject();
        jsonObject.put("countdown_award_des", "可领金币");
        jsonObject.put("close_dialog_title", "任务提示");
        jsonObject.put("close_dialog_des", "观看完整广告可获得金币奖励");
        jsonObject.put("close_dialog_exit_des", "文案4");
        jsonObject.put("close_dialog_continue_btn_des","文案5");
        jsonObject.put("countdown_wait_des", "文案6");
        jsonObject.put("countdown_success_des","文案7");
        jsonObject.put("countdown_repeat_des","文案8");
        jsonObject.put("countdown_fail_des","文案9");
        jsonObject.put("countdown_icon_light_url","http://cdn.aiclk.com/nsdk/res/imgstatic/incite_video_coin_light.png");
        jsonObject.put("countdown_icon_gray_url","http://cdn.aiclk.com/nsdk/res/imgstatic/incite_video_coin_gray.png");
        extraBundle.putString("descriptions",jsonObject.toString());

文案参数解释

编号 金币场景文案 文案解释 文案key
1 可领金币 倒计时上的奖励描述 countdown_award_des
2 任务提示 关闭弹窗上的标题 close_dialog_title
3 观看完整广告可获得金币奖励 关闭弹窗上的提示内容 close_dialog_des
4 放弃金币 关闭弹窗上的退出按钮的描述 close_dialog_exit_des
5 继续观看 关闭弹窗上的继续观看按钮描述 close_dialog_continue_btn_des
6 金币即将到账 倒计时上的请求等待描述 countdown_wait_des
7 金币已到账 倒计时上的请求成功描述 countdown_success_des
8 不能重复领金币 倒计时上的请求重复描述 countdown_repeat_des
9 加金币失败 倒计时上的请求失败描述 countdown_fail_des
10 金币亮色icon 倒计时上的亮色图片 countdown_icon_light_url
11 金币灰色icon 倒计时上的灰色图片 countdown_icon_gray_url

1 2 3

4 5

4.3 其他定制

//自定义设置发放奖励时间,会在播放结束前给onReward回调
extraBundle.putInt("reward_time",10);

//cpc激励视频全屏(显示状态栏、标题栏),0:关闭  1:开启, 默认关闭
//extraBundle.putInt("fullscreen",1);

五、开屏广告

开屏类型请求时,adType传6

5.1 广告请求

Bundle extBundle = new Bundle();
AdRequestParam requestParam = new AdRequestParam.Builder()
    .adslotID(getString(R.string.splash_ad))
    .adType(AdRequestParam.ADTYPE_SPLASH)
    .adLoadListener(new AdRequestParam.ADLoadListener() {

    @Override
    public void onADLoaded(IMultiAdObject adModel) {
        Log.i("aiclk", "onADLoaded:");
        Toast.makeText(SplashActivity.this, "广告加载成功", Toast.LENGTH_SHORT).show();
        if (adModel != null && adModel.isValid()) {
      //设置开屏广告回调接口,必须在showSplashView之前设置
            adModel.setADStateListener(new IMultiAdObject.ADStateListener() {
                @Override
                public void onAdEvent(int i, @NonNull Bundle bundle) {
                        if (i == ADEvent.EVENT_DOWNLOAD_DIALOG_SHOW) {
                //下载类型广告,点击出现下载合规弹窗回调
                        } else if (i == ADEvent.EVENT_DOWNLOAD_DIALOG_DISMISS) {
              //下载类型广告,下载合规弹窗回调
                        }
                    }
                });
      
            adModel.showSplashView(mSplashContainer, new IMultiAdObject.SplashEventListener() {
                @Override
                public void onObClicked() {
                    Log.i("aiclk", "onObClicked:");
                    Toast.makeText(SplashActivity.this, "广告点击", Toast.LENGTH_SHORT).show();
        }

                @Override
                public void onObShow() {
            Log.i("aiclk", "onObShow:");
            Toast.makeText(SplashActivity.this, "广告展现", Toast.LENGTH_SHORT).show();
        }

                @Override
                public void onObSkip() {
            Log.i("aiclk", "onObSkip:");
            Toast.makeText(SplashActivity.this, "广告点击跳过", Toast.LENGTH_SHORT).show();
            goToMainActivity();
        }

                @Override
                public void onObTimeOver() {
            Log.i("aiclk", "onObTimeOver:");
            Toast.makeText(SplashActivity.this, "广告倒计时结束", Toast.LENGTH_SHORT).show();
            goToMainActivity();
        }
      });
    }
  }

    @Override
    public void onAdFailed(String errorMsg) {
    Log.i("aiclk", "onAdFailed:" + errorMsg);
    Toast.makeText(SplashActivity.this, "广告无填充", Toast.LENGTH_SHORT).show();
    goToMainActivity();
  }
})
.extraBundle(extBundle)
.build();

IMultiAdRequest multiAdRequest = AiClkAdManager.getInstance().createAdRequest();

if (multiAdRequest != null) {
    multiAdRequest.invokeADV(requestParam);
}

5.2 开屏定制

开屏跳过按钮及合规点击区域默认由趣盟sdk渲染,可通过后台配置隐藏

//跳过按钮计时时间,默认5秒。推荐通过后台配置
extraBundle.putInt("countdown_time",5);

5.3 接口说明

IMultiAdObject.SplashEventListener 接口说明

方法名 返回类型 含义
onObClicked() 开屏广告点击
onObShow() 开屏广告曝光
onObSkip() 开屏广告点击跳过
onObTimeOver() 开屏广告倒计时时间到

六、插屏广告

6.1 广告请求

插屏类型请求时,adType传2

private void requestInteractionAd(String adslotId) {
    AdRequestParam requestParam = new AdRequestParam.Builder()
            .adslotID(adslotId)
            .adType(AdRequestParam.ADTYPE_INTERACTION)
            .adLoadListener(new AdRequestParam.ADLoadListener() {

                @Override
                public void onADLoaded(IMultiAdObject adModel) {
                    Log.i("aiclk", "onADLoaded... ...");
                    String title = adModel.getTitle();
                    List<String> urls = adModel.getImageUrls();
                    Pair<Integer, Integer> mediaSize = adModel.getMediaSize();
                    int materialType = adModel.getMaterialType();
                    Log.i("aiclk", "title:" + title);
                    Log.i("aiclk", "urls:" + urls);
                    Log.i("aiclk", "materialType:" + materialType);
                    Log.i("aiclk", "mediaSize:" + mediaSize);
                      //展示插屏广告
                    showInteractionAd(adModel);

                }

                @Override
                public void onAdFailed(String errorMsg) {
                    Log.i("aiclk", "onAdFailed:" + errorMsg);
                }
            })
            .build();

    IMultiAdRequest multiAdRequest = AiClkAdManager.getInstance().createAdRequest();

    if (multiAdRequest != null) {
        multiAdRequest.invokeADV(requestParam);
    }
}

private void showInteractionAd(IMultiAdObject adModel) {
    if (adModel != null && adModel.isValid()) {
        adModel.showInteractionAd(MainActivity.this, new AdRequestParam.ADInteractionListener() {

            @Override
            public void onAdClick() {
                Log.i("aiclk", "onAdClick");
            }

            @Override
            public void onADExposed() {
                Log.i("aiclk", "onAdShow");

            }

            @Override
            public void onAdFailed(String s) {
                Log.i("aiclk", "onAdFailed: " + s);
            }

            @Override
            public void onAdClose(Bundle bundle) {
                String adslotId = bundle.getString("adslot_id", "");
                Log.i("aiclk", "onAdClose: " + adslotId);
            }
        });
    }
}

6.2 接口说明

AdRequestParam.ADInteractionListener 接口说明

方法名 返回类型 含义
onAdClick() 点击回调
onADExposed() 曝光回调
onAdFailed(String s) 失败原因 渲染广告失败回调
onAdClose(Bundle bundle) 插屏广告关闭回调

6.3 关闭插屏广告

3.455.10.420 新增主动关闭插屏弹窗接口

示例:

//关闭插屏广告
AiClkAdManager.getInstance().closeInteractionAd(adModel) 

七、竞胜竞败回传

3.445版本及以上开始支持回传

示例:

adModel.winNotice(1000);
        adModel.lossNotice(100,ADEvent.PRICE_LOW,ADEvent.CSJ);

7.1 接口说明

IMultiAdObject 接口说明

方法名 含义
winNotice(int auctionSecondPrice); 竞价成功时上报接口
auctionSecondPrice 竞价第二名价格,单位是分 (接口调用时必填)
lossNotice(int auctionPrice, String lossReason, String winBidder); 竞价失败时上报接口
auctionPrice 胜出者价格 单位分(非必填)
lossReason 竞价失败原因(非必填)
winBidder 胜出者 (非必填) 枚举值如下

ADEvent

/**
 * 竞价失败原因
 * 100 底价过滤
 * 101 bid价格低于最高价
 * 102 素材黑名单过滤
 * 103 竞品过滤
 * 104 在有效时间内,未返回广告
 * >=1000  开发者和广告平台协商补充
 * 1001 缓存超时
 * 1002 超出上限被丟弃
 */
public static final String PRICE_FILTER = "100";
public static final String PRICE_LOW = "101";
public static final String BLACKLIST_FILTER = "102";
public static final String COMPETE_FILTER = "103";
public static final String TIMEOUT_FILTER = "104";

/**
 * 竞价失败原因
 * csj/toutiao	穿山甲
 * ylh/gdt	优量汇
 * kuaishou	快手
 * bqt/baidu	百青藤
 * sigmob	sigmob
 * oppo	oppo
 * vivo	vivo
 * jingdong	京东
 * xiaomi	小米
 * zs	自售
 * other	其他家 (可以联系添加)
 * qumeng/qtt	趣盟
 */
public static final String CSJ = "toutiao";
public static final String GDT = "gdt";
public static final String KUAISHOU = "kuaishou";
public static final String BAIDU = "baidu";
public static final String SIGMOB = "sigmob";
public static final String OPPO = "oppo";
public static final String VIVO = "vivo";
public static final String JINGDONG = "jingdong";
public static final String XIAOMI = "xiaomi";
public static final String ZS = "zs";
public static final String OTHER = "other";
public static final String QUMENG = "qumeng";

八、GroMore聚合平台自定义广告接入文档

接入方式下载jar包集成(根据穿山甲版本选择其一)

穿山甲单独gromore版本:https://docs.qquanquan.com/android_sdk/gromore/1.0.4/gromore_qumeng_pangle_adapter.jar

穿山甲融合gromore版本:https://docs.qquanquan.com/android_sdk/gromore/1.0.5/gromore_qumeng_ronghe_adapter_v2.jar

注:聚合版本可通过gromore的接口设置合规参数(TTAdConfig->setMediationConfig->getLocalExtra)

@Override
public Map<String, Object> getLocalExtra() {
Map<String, Object> stringObjectMap = new HashMap<>();
ArrayList<PackageInfo> packageInfos = new ArrayList<>();
packageInfos.add(new PackageInfo());
stringObjectMap.put(QMCustomerConfig.MEDIA_APP_LIST,packageInfos);
stringObjectMap.put(QMCustomerConfig.MEDIA_IS_CAN_APP_LIST,true);
stringObjectMap.put(QMCustomerConfig.MEDIA_IS_CAN_ANDROID_ID,true);
stringObjectMap.put(QMCustomerConfig.MEDIA_KEY_ANDROID_ID,"");
stringObjectMap.put(QMCustomerConfig.MEDIA_OAID,"");
stringObjectMap.put(QMCustomerConfig.MEDIA_NEW_THREAD, 1) //异步初始化趣盟
return stringObjectMap;
}

自定义广告源adapter参数

广告类型 广告类名称
初始化 com.qumeng.advlib.gm.QMCustomerConfig
激励视频 com.qumeng.advlib.gm.QMRewardVideoAdapter
插屏 com.qumeng.advlib.gm.QMInterstitialAdapter
横幅 com.qumeng.advlib.gm.QMBannerAdapter
原生 com.qumeng.advlib.gm.QMNativeAdapter
开屏 com.qumeng.advlib.gm.QMSplashAdapter

8.1 添加广告平台

请求返回错误码

3.445版本及以上详细错误码

错误码 说明 排查方向
100001 无填充,没有合适广告返回导致的,偶现属于正常情况 "reason":100 此次出价未过底价(固价未过栏位底价)
"reason":101 请求频率过高,建议:避免同一时间内高频拉取广告
"reason":102 没有合适广告返回,检查流量提高用户质量,注:在开发测试阶段,可以添加设备或更换设备解决,如果还未填充可以联系运营
"reason":103 命中平台策略导致的无填充,如果开发测试阶段可以联系运营反馈
"reason":104 命中检索204策略导致的无填充,如果开发测试阶段可以联系运营反馈
"reason":105 命中作弊用户导致的无填充,如果开发测试阶段可以联系运营反馈
"reason":106 命中流量低价值策略导致的无填充,检查流量提高展示率,注:在开发测试阶段,可以添加设备或更换设备解决,如果还未填充可以联系运营
"reason":107 命中平台配置导致的无填充,如果开发测试阶段可以联系运营反馈"
"reason":-1 其它异常"
100002 服务器错误 "reason":201 检索服务器异常
100003 请求失败 "reason":301 请求体解析失败
100004 代码位不合法 "reason":401 检查代码位ID是否传入空字符串或特殊字符,注:新建的代码位需要10分钟左右的生效时间
100005 请求包名与媒体包名不一致 "reason":501 实际发起的包名和媒体的包名是否一致,注:如果媒体是通过趣盟运营创建的可以联系趣盟运营协同排查
100006 广告请求代码位类型不匹配 "reason":601 例如开屏代码位使用的的激励视频方法
200001 代码位不能为空 检查设置代码位ID是否为空
200002 无填充 命中平台策略导致的无填充,如果开发测试阶段可以联系运营反馈
200003 网络错误 网络链接异常
200004 请求adtype错误 检查请求接口和adtype是否一致

历史版本

版本号 发布日期 备注
3.483.10.449 2026-09-22 【优化】适配android高版本
【优化】开屏广告耗时
【优化】激励视频交互
【优化】插屏样式
【修复】修复已知问题
3.482.14.448 2026-07-30 【新增】京东优惠券样式
【优化】提高开屏响应速度
【优化】双列式信息流模版优化
【修复】修复已知问题
3.481.10.447 2026-04-20 【修复】修复已知问题
3.479.14.445 2026-03-25 【修复】修复已知问题
3.479.13.445 2026-03-23 【变更】混淆规则变更,详细参考aar中的proguard.txt文件&混淆1.3混淆配置。主要变更点:
-keep class com.qm.advlib.trdparty.secure.**{*;} -keep class com.qm.advlib.trdparty.identifier.** {*;}
【修复】修复已知问题
3.479.12.445 2026-03-19 【修复】修复已知问题
3.479.10.445 2026-03-12 【优化】初始化耗时优化
【优化】广告请求耗时优化
【修复】修复已知问题
3.477.11.443 2026-01-09 【优化】模版信息流样式优化
【优化】激励视频横版样式调整
【修复】修复已知问题
3.475.10.441 2025-10-27 【修复】已知问题
3.474.12.440 2025-09-28 【合规】删除摇一摇组件接口
【新增】支持多种比例插屏新样式
【修复】已知问题
3.473.10.439 2025-07-21 【新增】工信部新规扭一扭
【修复】已知问题
3.472.10.438 2025-07-08 【新增】广告有效性判断:isValid()方法
【优化】优化广告耗时
【修复】已知问题
3.471.10.437 2025-06-06 【新增】开屏样式/资源加载优化
【合规】移除bootid获取
【修复】已知问题
3.470.13.436 2025-04-25 【优化】618预算适配
【优化】激励视频样式&交互
【优化】小程序调起链路
【废弃】部分隐私信息接口
【修复】已知问题
3.469.15.435 2025-02-17 【优化】SDK广告链路
【优化】优化加密算法,提升SDK安全性
【修复】已知问题
3.468.13.434 2024-11-29 【优化】优化boot_id获取
【提升】SDK安全性能
【修复】已知问题
3.467.10.433 2024-09-20 【优化】广告链路,适配新预算
【修复】已知问题
3.466.15.432 2024-08-12 【优化】初始化耗时优化
【优化】安卓support&androidx合并通用包
【修复】已知问题
3.465.10.431 2024-06-18 【新增】通用包支持androidx和非androidx
【新增】接口增加链路请求唯一ID接口
【提升】广告链路优化,适配新预算
【修复】已知问题
【优化】SDK性能提升稳定性
3.464.10.430 2024-06-03 【优化】SDK稳定性提升
3.463.10.429 2024-05-11 【优化】SDK稳定性提升
3.462.15.428 2024-04-30 【合规】新增oaid获取开关
3.462.12.428 2024-04-10 【优化】SDK稳定性提升
【修复】已知问题
3.461.11.427 2024-01-26 【重要通知】topOn需要单独接入jar包
【新增】信息流视频支持TextureView
【优化】通知栏下载功能优化
【优化】SDK稳定性提升
3.460.10.426 2023-12-12 【优化】插屏场景合规优化
【优化】开屏渲染加载优化
【优化】SDK稳定性提升
3.459.11.425 2023-11-08 【新增】信息流左图右文自适应模板
【新增】通知栏下载进度条
【优化】合规方法调用相关优化
【优化】插屏场景优化
【优化】SDK稳定性提升
3.457.10.422 2023-09-11 【新增】新增信息流下载控制器
【新增】新增信息流组图自渲染类型
【优化】兼容android14版本
【优化】优化开屏广告加载速度
【优化】SDK稳定性提升
3.456.10.421 2023-08-01 【新增】新增下载合规六要素-产品功能介绍
【新增】激励视频支持自定义设置发放奖励时间
【新增】自渲染信息流支持传入创意点击区域
【优化】SDK稳定性优化
3.455.10.420 2023-07-05 【新增】支持横版开屏、激励视频、插屏广告场景
【新增】增加配置个性化广告开关
【新增】增加关闭插屏弹窗接口
【优化】SDK稳定性优化
3.452.10.419 2023-05-09 【优化】优化多种广告场景,支持618预算
【新增】支持传入lbs参数
【修复】SDK 稳定性优化
3.451.10.418 2023-03-29 【优化】优化应用市场直调预算
【新增】功能控制信息流不自动播放
【修复】SDK 稳定性优化
3.449.10.417 2023-03-07 【优化】隐私合规获取优化
【优化】增加下载类广告埋点
【修复】SDK 稳定性优化
3.448.10.416 2023-02-13 【新增】视频支持不自动播放功能
【优化】隐私合规获取优化
【修复】SDK 稳定性优化
3.447.10.414 2023-01-04 【优化】优化开屏广告展示效果
【优化】下载合规弹窗横屏展示效果
【修复】SDK 稳定性优化
3.446.10.413 2022-11-29 【优化】优化激励视频广告交互方式
【优化】SDK 稳定性优化
3.445.11.412 2022-11-11 【新增】广告请求无填充时错误码信息
【新增】竞价成功失败回传
【优化】SDK 稳定性优化
3.441.10.411 2022-10-18 【新增】兼容topon接入
【优化】信息流、激励视频广告样式交互方式
【优化】SDK稳定性优化
3.440.10.410 2022-09-29 【新增】支持服务端bidding功能
【优化】广告样式交互方式
【优化】SDK 稳定性优化
3.439.10.409 2022-09-06 【新增】支持微信小程序类型广告
【优化】激励视频交互方式
【新增】隐私合规主动授权开关
【优化】SDK 稳定性优化
3.438.10.408 2022-08-15 【新增】支持合规信息传入
【新增】定制化任务场景
【优化】激励视频交互体验
【优化】SDK 性能优化
3.437.10.407 2022-07-25 【新增】激励视频样式
【优化】插屏交互方式
【优化】SDK 稳定性优化
3.436.10.406 2022-07-11 【新增】插屏交互方式
【新增】支持 topon 方式接入头部竞价
【优化】视频落地页交互体验
【优化】SDK 性能优化
3.435.10.405 2022-06-27 【新增】开屏热区新增合规弹窗
【新增】激励视频增加引导样式
【优化】信息流场景视频支持播放器回调
【新增】插屏支持n秒出跳过按钮
【修复】已知崩溃、内存溢出问题
【修复】激励视频静音失效
3.433.10.404 2022-06-08 提升SDK稳定性
广告请求优化
3.429.10.404 2022-05-31 应用列表上报修复
增加版本稳定性
兼容armeabi方式打包架构
3.428.10.402 2022-05-17 隐私合规信息加密
修复androidx版本模版渲染视频问题
新增banner轮播类型广告
新增互动类型广告
删除对relinker的依赖
删除媒体需要声明组件和混淆文件
替换趣盟包名
3.427.10.392 2022-04-29 支持TopOn自定义广告平台接入
新增插屏广告样式模板
新增角标广告样式模板
新增信息流模板渲染广告
优化sdk包体积
3.423.10.389 2022-04-15 优化开屏广告效果
默认设置广告合规下载弹窗
优化站内push弹窗广告
3.422.10.388 2022-03-31 增加趣盟logo回调方法
优化插屏广告效果
修复站内push弹窗广告渲染
3.421.10.387 2022-03-18 优化激励视频播放
优化拉新拉活广告投放
3.420.10.386 2022-03-04 修复跳转应用商城打开应用
imei加密传输
支持自渲染icon拉活场景
3.419.10.385 2022-02-18 增加开屏摇一摇功能
开屏支持自定义跳过按钮,合规点击区域
3.418.10.384 2022-01-28 修复oaid获取问题
兼容工信部sdk 1.0.13~1.1.0
3.418.10.382 2022-01-14 新增模板渲染icon拉活类型广告
新增站内push弹窗类型广告
新增获取广告应用信息接口需在bin dview前调用

常见问题 Q&A

Q1: 广告请求失败?

参考详细错误码。联系产品进行相关配置来提高填充率.

Q2: 广告栏位号如何申请?

广告栏位号要联系产品进行申请.

Q3: 初始化失败或构建请求为空?

1、检查混淆配置keep是否生效

2、检查androidx或非androidx版本集成是否有问题