# 天目广告SDK-Android **Repository Path**: admobile_top/tianmudemo_android ## Basic Information - **Project Name**: 天目广告SDK-Android - **Description**: 天目广告SDK-Android - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-07-01 - **Last Updated**: 2026-06-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 天目Ads Sdk——接入文档 V3.1.1.4 ``` SDK名称: 天目Ads SDK 开发者: 杭州艾狄墨搏信息服务有限公司 更新日期: 2026-06-15 功能介绍: 天目Ads SDK是一款全面的 APP 广告变现解决方案,支持多种广告格式,包括横幅、插屏和视频广告。它具有精准和详细的数据分析功能,帮助开发者优化广告投放和提升收益。 ``` [SDK 下载地址](https://doc.admobile.top/AndroidSDK/TianmuAndroid%E6%89%8B%E5%8A%A8%E9%9B%86%E6%88%90.zip) [查看更新日志](https://doc.admobile.top/ssp/pages/tmsdkchand/) [查看接入文档](https://doc.admobile.top/ssp/pages/tmsdkand/) [隐私政策](https://www.admobile.top/privacyPolicy.html) [合规指引](https://doc.admobile.top/ssp/pages/tianmu_compliance/) [用户协议](https://doc.admobile.top/ssp/pages/contract/) ## 1. 概述 ### 1.1 概述 尊敬的开发者朋友,欢迎您使用天目Ads SDK。通过本文档,您可以快速完成广告SDK的集成。 **注意:本SDK仅支持中国大陆地区**;如需发布到Google Play,请勿引入本SDK及相关依赖文件。 **将天目接入到聚合平台案例** > [天目聚合到Topon中](https://gitee.com/admobile/toponadaptertianmudemo) > > [天目聚合到Gromore中](https://gitee.com/admobile/gromoreadapter-tianmu-android) ### 2. 支持的广告类型
类型 简介 适用场景
开屏广告 开屏广告以APP启动作为曝光时机的模板广告,需要将开屏广告视图添加到承载的广告容器中,提供5s可感知广告展示 APP启动界面常会使用开屏广告
Banner广告 Banner广告是横向贯穿整个可视页面的模板广告,需要将Banner广告视图添加到承载的广告容器中 任意界面的固定位置,不建议放在RecyclerView、List这种滚动布局中当item
信息流自渲染广告 信息流自渲染广告,可自行设计样式,以满足不同的样式需求 信息流列表,轮播控件,固定位置都是较为适合
信息流模板广告 信息流模板广告,支持上文下图、下图上文、左图右文、右图左文、纯图 信息流列表,轮播控件,固定位置都是较为适合
插屏广告 插屏广告是移动广告的一种常见形式,在应用流程中弹出,当应用展示插屏广告时,用户可以选择点击广告,访问其目标网址,也可以将其关闭并返回应用 在应用执行流程的自然停顿点,适合投放这类广告
激励视频广告 将短视频融入到APP场景当中,用户观看短视频广告后可以给予一些应用内奖励 常出现在游戏的复活、任务等位置,或者网服类APP的一些增值服务场景
创新广告 将广告悬浮在页面上
## 3. Demo下载链接 > [TianmuDemo-演示APK下载地址](https://gitee.com/admobile/tianmu-advertising-sdk-android/blob/master/app-debug.apk) ## 4. SDK版本说明 > [SDK版本更新日志](https://doc.admobile.top/ssp/pages/tmsdkchand/) ## 5. SDK接入流程 ### 5.1 添加SDK到工程中 接入环境:**Android Studio**,**minSdkVersion 16** #### 5.1.1 添加仓库地址 首先需要在项目的build.gradle文件中引入如下配置: ```java allprojects { repositories { ... google() jcenter() mavenCentral() // 添加以下仓库地址 maven { url "https://maven.admobile.top/repository/maven-releases/" } } } ``` #### 5.1.2 添加TianmuSdk 将广告所需要的依赖集成进去 ```java dependencies { // support支持库,如果是AndroidX请使用对应的支持库 implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:design:28.0.0' // Tianmu广告SDK implementation 'cn.admobiletop.adsuyi.ad.third:tianmu:3.1.1.4' } ``` #### 5.1.3 注意事项 * 支持主流架构,x86架构暂不支持 ```java ndk { // 设置支持的SO库架构,暂不支持x86 abiFilters 'armeabi-v7a', 'arm64-v8a' } ``` * 引入了Android R的 标签,需要对gradle版本进行限制,限制范围为:3.3.3、 3.4.3、 3.5.4、3.6.4、4.0.1 ,开发者根据自身情况酌情升级 ### 5.3 权限申请 使用SDK时可能需要以下权限,为了保证使用广告的正确,请在6.0及以上的手机中使用SDK前及时申请。 ```java ``` ### 5.4 兼容配置 #### 5.4.1 网络配置 需要在 AndroidManifest.xml 添加依赖声明**uses-library android:name="org.apache.http.legacy" android:required="false"**, 且 application标签中添加 **android:usesCleartextTraffic="true"**,适配网络http请求,否则 SDK可能无法正常工作,接入代码示例如下: ```java ... ... ``` #### 5.4.2 混淆配置 如果打包时开启了混淆配置,请按需添加以下混淆内容,并保证广告资源文件不被混淆 ```java -keep class com.tianmu.**{ *; } -keep class tianmu.com.** { *; } -keep interface tianmu.com.** { *; } -keep class androidx.** {*;} -keep public class com.tianmu.nis.sdkwrapper.Utils {public ;} ``` ### 5.5 隐私信息控制开关 **为了保证您的App顺利通过检测,结合当前监管关注重点,我们可以将TianmuSdk的初始化放在用户同意隐私政策之后。** **如合规有更高要求,可以使用以下方法进行控制,但会严重降低广告收益,可根据实际需求进行设置,或联系我发运营人员获取建议。** 同时TianmuSDK初始化时开放以下接口,确保mac,imei等设备标识不被读取: ```java TianmuSDK.getInstance().init(this, new TianmuInitConfig.Builder() ... //【慎改】是否同意隐私政策,将禁用一切设备信息读起严重影响收益 .agreePrivacyStrategy(true) // 是否可获取定位数据 .isCanUseLocation(true) // 是否可获取设备信息 .isCanUsePhoneState(true) ... .build()); ``` ### 5.6 设备标识 #### 5.6.1 OAID支持 **Android10之后IMEI等数据无法获取,这对广告投放将产生一定影响,所以移动安全联盟(MSA)提出OAID来代替IMEI参与广告投放决策,OAID的支持会在一定程度上影响广告收益和广告填充;** OAID集成并不繁琐,可参考OAID官网进行集成[链接](http://www.msa-alliance.cn/col.jsp?id=120) #### 5.6.2 向SDK传入设备标识 **注意,移除之前版本初始化OAID设置方法**: ~~isCanUseOAID()~~ ~~setOAID()~~ 统一由可选参数 : TianmuCustomController 进行设置 - 新增可选参数设置,配合隐私信息控制开关一起使用 ```java TianmuSDK.getInstance().init(this, new TianmuInitConfig.Builder() ... .setTianmuCustomController(new TianmuCustomController() { /** * 当isCanUsePhoneState=false时,可传入imei信息,天目使用您传入的imei信息 * @return imei信息 */ @Override public String getDevImei() { return super.getDevImei(); } /** * 当isCanUsePhoneState=false时,可传入AndroidId信息,天目使用您传入的AndroidId信息 * @return androidid信息 */ @Override public String getAndroidId() { return super.getAndroidId(); } /** * 当isCanUseLocation=false时,可传入地理位置信息,天目使用您传入的地理位置信息 * @return 极光地理位置参数TianmuLocationProvider */ @Override public TianmuLocationProvider getTianmuLocation() { return super.getTianmuLocation(); } /** * 当isCanUseWifiState=false时,可传入Mac地址信息,天目使用您传入的Mac地址信息 * @return Mac地址 */ @Override public String getMacAddress() { return super.getMacAddress(); } /** * 开发者可以传入oaid ,若不传或为空值,则不使用oaid信息 * @return oaid */ @Override public String getDevOaid() { return super.getDevOaid(); } /** * 开发者可以传入vaid ,若不传或为空值,则不使用vaid信息 * @return vaid */ @Override public String getDevVaid() { return super.getDevVaid(); } }) ... .build()); ``` ### 5.7 个性化开关 ```java // 设置个性化广告,true:开启、false:关闭 TianmuSDK.setPersonalizedAds(boolean enablePersonalized); ``` ## 6. 示例代码 ### 6.1 SDK初始化 在Application或Activity中进行SDK的初始化(详情请参考Demo) #### 6.1.1 初始化主要 API **TianmuSDK** com.tianmu.TianmuSDK | 方法名 | 介绍 | | ------------ | ---- | | init(Context context, TianmuInitConfig config) | 构造方法。参数说明:context(初始化SDK的上下文对象)、config(初始化配置信息)。| | init(Context context, TianmuInitConfig config, TianmuInitListener listener) | 构造方法。参数说明:context(初始化SDK的上下文对象)、config(初始化配置信息)、listener(初始化状态监听)。| | setPersonalizedAds(boolean enablePersonalized) | 设置个性化推荐开关。参数说明:enablePersonalized(true:开启,false:关闭, 默认:true)。| | setCheckCacheApk(boolean checkCacheApk) | 检测下载完成但未安装的下载类广告。参数说明:checkCacheApk(true:开启,false:关闭, 默认:true)。| | setCanUseLocation(boolean isCanUseLocation) | 设置SDK是否可以使用定位信息,静态方法可随时调用。参数说明:isCanUseLocation(true:开启,false:关闭, 默认:true)。| | setCanUsePhoneState(boolean isCanUsePhoneState) | 设置SDK是否可以使用IMEI等设备信息,静态方法可随时调用。参数说明:isCanUsePhoneState(true:开启,false:关闭, 默认:true)。| | setCanUseWifiState(boolean isCanUseWifiState ) | 设置SDK是否可以使用WIFI信息,静态方法可随时调用。参数说明:isCanUseWifiState(true:开启,false:关闭, 默认:true)。| **TianmuInitConfig** com.tianmu.config.TianmuInitConfig | 方法名 | 介绍 | | ------------ | ---- | | appId(String appId) | 设置AppId,必填参数。| | debug(boolean debug) | 设置是否是Debug模式。参数说明:debug(true:开启,false:关闭, 默认:false)开发阶段以及提交测试阶段可设置为true,方便异常排查。| | isCanUseLocation(boolean isCanUseLocation) | 设置SDK是否可以使用定位信息。参数说明:isCanUseLocation(true:开启,false:关闭, 默认:true)。| | isCanUsePhoneState(boolean isCanUsePhoneState) | 设置SDK是否可以使用IMEI等设备信息。参数说明:isCanUsePhoneState(true:开启,false:关闭, 默认:true)。| | isCanUseWifiState(boolean isCanUseWifiState) | 设置SDK是否可以使用WIFI信息。参数说明:isCanUseWifiState(true:开启,false:关闭, 默认:true)。| | agreePrivacyStrategy(boolean agreePrivacyStrategy) | 是否同意隐私政策。参数说明:agreePrivacyStrategy(true:开启,false:关闭, 默认:true)。| | setMultiprocess(boolean isMultiprocess) | 是否支持多进程初始化。参数说明:isMultiprocess(true:支持,false:不支持, 默认:false),应用如需支持多进获取展示广告,请在每个进程中都初始化SDK。| | setTianmuCustomController(TianmuCustomController customController) | 自定义设备信息。可选参数。 请参考5.6.2 向SDK传入设备标识 | | setWXAppId(String wxAppId) | 设置微信AppId。参数说明:wxAppId(微信AppId)| **TianmuCustomController** com.tianmu.config.TianmuCustomController | 方法名 | 介绍 | | ------------ | ---- | | getDevImei() | 当isCanUsePhoneState=false时,可传入imei信息,天目使用您传入的imei信息。| | getAndroidId() | 当isCanUsePhoneState=false时,可传入AndroidId信息,天目使用您传入的AndroidId信息。| | getTianmuLocation() | 当isCanUseLocation=false时,可传入地理位置信息,天目使用您传入的地理位置信息。| | getMacAddress() | 当isCanUseWifiState=false时,可传入Mac地址信息,天目使用您传入的Mac地址信息。| | getDevOaid() | 开发者可以传入oaid ,若不传或为空值,则不使用oaid信息。| | getDevVaid() | 开发者可以传入vaid ,若不传或为空值,则不使用vaid信息。| #### 6.1.2 初始化接入示例 ```java // 初始化Tianmu广告SDK TianmuSDK.getInstance().init(this, new TianmuInitConfig.Builder() // 设置AppId,必须的 .appId(String appId) // 是否开启Debug,开启会有详细的日志信息打印 // 注意上线后请置为false .debug(BuildConfig.DEBUG) ... .build()); ```

PS :AppId通过后台配置生成,初始化必须在主线程中进行。

### 6.2 开屏广告 开屏广告建议在闪屏页进行展示,开屏广告的宽度和高度取决于容器的宽高,会撑满广告容器;**开屏广告的高度必须大于等于屏幕高度(手机屏幕完整高度,包括状态栏之类)的75%**,否则onAdFailed方法会被回调。 #### 6.2.1 开屏广告主要 API **SplashAd** com.tianmu.ad.SplashAd | 方法名 | 介绍 | | ------------ | ---- | | SplashAd(Context context) | 构造方法。参数说明:context(加载广告的上下文对象)。| | SplashAd(Context context, View skipView) | 构造方法。参数说明:context(加载广告的上下文对象)、skipView(自定义跳过按钮)。| | setImmersive(boolean isImmersive) | 设置沉浸效果。参数说明:isImmersive(true:沉浸,false:不沉浸, 目前仅影响默认跳过按钮位置)。| | setCountDownTime(long countDownTime) | 设置倒计时跳过时长。参数说明:countDownTime([3000ms~5000ms],默认5000ms)。| | setListener(SplashAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。| | setSensorDisable(boolean isSensorDisable) | 是否禁用传感器(可禁用摇一摇、扭一扭)。参数说明:isSensorDisable(true:禁用,false:启用,默认false)。| | setMute(boolean isMute) | 视频静音设置。参数说明:isMute(true:静音、false:不静音,默认:true)。| | loadAd(String posId) | 请求广告。参数说明:posId(广告位ID)。| | release() | 释放广告。| **SplashAdListener** com.tianmu.ad.listener.SplashAdListener | 方法名 | 介绍 | | ------------ | ---- | | onAdTick(long millisUntilFinished) | 广告倒计时剩余时长回调。参数说明:millisUntilFinished(剩余时间,单位:秒))。| | onAdReceive(SplashAdInfo adInfo) | 广告加载成功回调。| | onRenderSuccess(SplashAdInfo adInfo) | (V3.1.1.4新增)广告渲染成功回调(素材渲染成功,非真正展示)。| | onRenderFailed(SplashAdInfo adInfo, int code, String msg) | (V3.1.1.4新增)广告渲染失败回调。参数说明:adInfo(广告对象)、code(错误码)、msg(错误原因)| | onAdExpose(SplashAdInfo adInfo) | 广告展示回调。| | onAdClick(SplashAdInfo adInfo) | 广告点击回调。| | onAdSkip(SplashAdInfo adInfo) | 广告跳过回调,用户点击跳过按钮时触发。| | onAdClose(SplashAdInfo adInfo) | 广告关闭回调,用户点击跳过按钮、触发落地页后返回开屏页、倒计时结束,则触发。| | onAdFailed(TianmuError error) | 广告失败回调。参数说明:error(广告错误信息)。| **SplashAdInfo** com.tianmu.ad.bean.SplashAdInfo | 方法名 | 介绍 | | ------------ | ---- | | sendLossNotice(int price, @BidLossNotice int reason) | 竞败上报。参数说明:price(回传竞赢价格(ecpm),单位:分)、reason(竞败原因)。| | getBidPrice() | 获取竞价价格(ecpm),单位:分。| | getBidFloor() | 获取底价(ecpm),单位:分。| | isOvertime() | 广告是否超时(广告需要在10分钟内展示)。| | getSplashAdView() | 获取广告视图。| | render() | 渲染广告,请在上述方法最后调用。| #### 6.2.2 开屏广告接入示例 ```java SplashAd splashAd = new SplashAd(Context context); splashAd.setListener(new SplashAdListener() { @Override public void onAdTick(long millisUntilFinished) { // 倒计时剩余时长(单位:秒) } @Override public void onAdReceive(SplashAdInfo splashAdInfo) { // 广告获取成功回调,在此回调中展示广告 // 获取开屏广告视图 View view = splashAdInfo.getSplashAdView(); // 将广告视图添加到容器中,注意容器高度要大于屏幕75% flContainer.addView(view); // 渲染广告,一定要最后调用 splashAdInfo.render(); } @Override public void onRenderSuccess(SplashAdInfo splashAdInfo) { // 广告渲染成功回调 } @Override public void onRenderFailed(SplashAdInfo splashAdInfo, int code, String msg) { // 广告渲染失败回调,可在此处进入应用首页 } @Override public void onAdExpose(SplashAdInfo splashAdInfo) { // 广告展示回调 } @Override public void onAdClick(SplashAdInfo splashAdInfo) { // 广告点击回调 } @Override public void onAdSkip(SplashAdInfo splashAdInfo) { // 广告跳过回调 } @Override public void onAdClose(SplashAdInfo splashAdInfo) { // 广告关闭回调,可在此处进入应用首页 } @Override public void onAdFailed(TianmuError error) { // 广告失败回调,可在此处进入应用首页 } }); splashAd.loadAd(String posId); ``` > [开屏广告示例详情](https://gitee.com/admobile/tianmu-advertising-sdk-android/blob/master/app/src/main/java/com/tianmu/demo/ad/SplashAdActivity.java) ### 6.3 横幅广告 Banner横幅广告建议放置在 **固定位置**,而非ListView、RecyclerView、ViewPager等控件中充当Item,Banner广告支持多种尺寸比例,可在后台创建广告位时配置,Banner广告的宽度将会撑满容器,高度自适应,建议Banner广告容器高度也为自适应。 #### 6.3.1 横幅广告主要 API **BannerAd** com.tianmu.ad.BannerAd | 方法名 | 介绍 | | ------------ | ---- | | BannerAd(Context context, ViewGroup container) | 构造方法。参数说明:context(加载广告的上下文对象)、container(横幅广告展示容器)。| | BannerAd(Context context) | 构造方法,加载展示分离使用。参数说明:context(加载广告的上下文对象)。| | setListener(BannerAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。| | loadAd(String posId) | 请求广告。参数说明:posId(广告位ID)。| | release() | 释放广告。| **BannerAdListener** com.tianmu.ad.listener.BannerAdListener | 方法名 | 介绍 | | ------------ | ---- | | onAdReceive(BannerAdInfo adInfo) | 广告加载成功回调。| | onAdExpose(BannerAdInfo adInfo) | 广告展示回调。| | onAdClick(BannerAdInfo adInfo) | 广告点击回调。| | onAdClose(BannerAdInfo adInfo) | 广告关闭回调。| | onAdFailed(TianmuError error) | 广告失败回调。参数说明:error(广告错误信息)。| **BannerAdInfo** com.tianmu.ad.bean.BannerAdInfo | 方法名 | 介绍 | | ------------ | ---- | | getAdView() | 获取广告视图。| | render() | 渲染广告,请在上述方法最后调用。| #### 6.3.2 横幅广告接入示例 ```java BannerAd bannerAd = new BannerAd(Context context, ViewGroup container); bannerAd.setListener(new BannerAdListener() { @Override public void onAdExpose(BannerAdInfo bannerAdInfo) { // 广告展示回调 } @Override public void onAdClick(BannerAdInfo bannerAdInfo) { // 广告点击回调 } @Override public void onAdClose(BannerAdInfo bannerAdInfo) { // 广告关闭回调 } @Override public void onAdReceive(BannerAdInfo bannerAdInfo) { // 广告获取成功回调 } @Override public void onAdFailed(TianmuError error) { // 广告失败回调 } }); bannerAd.loadAd(String posId); ``` >[Banner广告示例详情](https://gitee.com/admobile/tianmu-advertising-sdk-android/blob/master/app/src/main/java/com/tianmu/demo/ad/BannerAdActivity.java) ### 6.4 信息流自渲染广告 信息流自渲染广告,可根据NativeAdInfo返回的素材自定义样式。 **注意,信息流广告点击关闭时,开发者需要在onAdClose回调中将广告容器隐藏或移除** #### 6.4.1 信息流自渲染广告主要 API **NativeAd** com.tianmu.ad.NativeAd | 方法名 | 介绍 | | ------------ | ---- | | NativeAd(Context context) | 构造方法。参数说明:context(加载广告的上下文对象)。| | setMute(boolean isMute) | 视频静音设置。参数说明:isMute(true:静音、false:不静音,默认:true)。| | setListener(NativeAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。| | loadAd(String posId) | 请求广告。参数说明:posId(广告位ID)。| | release() | 释放广告。| **NativeAdListener** com.tianmu.ad.listener.NativeAdListener | 方法名 | 介绍 | | ------------ | ---- | | onAdReceive(List\ adInfos) | 广告加载成功回调。| | onAdExpose(NativeAdInfo adInfo) | 广告展示回调。| | onAdClick(NativeAdInfo adInfo) | 广告点击回调。| | onAdClose(NativeAdInfo adInfo) | 广告关闭回调,在此回调中移除页面中的视图。| | onAdFailed(TianmuError error) | 广告失败回调。参数说明:error(广告错误信息)。| | onRenderFailed(NativeAdInfo adInfo, TianmuError error) | 广告失败回调。参数说明:error(广告错误信息)。| **NativeAdInfo** com.tianmu.ad.bean.NativeAdInfo | 方法名 | 介绍 | | ------------ | ---- | | sendLossNotice(int price, @BidLossNotice int reason) | 竞败上报。参数说明:price(回传竞赢价格(ecpm),单位:分)、reason(竞败原因)。| | getBidPrice() | 获取竞价价格(ecpm),单位:分。| | getBidFloor() | 获取底价(ecpm),单位:分。| | isOvertime() | 广告是否超时(广告需要在10分钟内展示)。| | isVideo() | 判断素材是否包含视频。| | getMediaView(ViewGroup container) | 获取素材中的视频,获取前请通过isVideo()方法进行判断。| | setVideoListener(VideoListener listener) | 设置视频相关状态回调。参数说明:listener(视频状态监听器)| | getTitle() | 广告标题。| | getDesc() | 广告描述。| | getImageUrl() | 广告图片。| | getImageUrls() | 广告图片组。| | getAdSource() | 广告来源。| | getAdTarget() | 广告标识,当getAdSource()不为空时,该字段将返回“广告”| | getAppInfo() | 获取六要素信息,返回AppInfo对象 | | registerCloseView(View ivClose) | 注册视图关闭事件。| | registerView(ViewGroup viewGroup, View... views) | 注册视图曝光和点击事件。参数说明:viewGroup(曝光检测视图)、views(广告可被点击视图)。| com.tianmu.ad.bean.AppInfo | 方法名 | 介绍 | | ------------ | ---- | | getName() | 应用名。| | getDeveloper() | 开发者名。| | getVersion() | 版本号。| | getIconUrl() | 应用图标。| | getPermissionsUrl() | 权限地址。| | getPermissionsInfo() | 权限详情。| | getPrivacyUrl() | 隐私地址。| | getDescriptionUrl() | 功能地址。| | getIcp() | 备案号。| **VideoListener** com.tianmu.ad.listener.VideoListener | 方法名 | 介绍 | | ------------ | ---- | | onVideoStart(INativeAd nativeAd) | 视频播放开始回调。| | onVideoFinish(INativeAd nativeAd) | 视频播放完成回调。| | onVideoPause(INativeAd nativeAd) | 视频暂停回调。| | onVideoError(INativeAd nativeAd) | 视频播放异常。| #### 6.4.2 信息流自渲染广告接入示例 ```java NativeAd nativeAd = new NativeAd(Context context); nativeAd.setListener(new NativeAdListener() { @Override public void onRenderFailed(NativeAdInfo nativeAdInfo, TianmuError error) { // 广告渲染失败回调 } @Override public void onAdReceive(List nativeAdInfos) { // 广告获取成功回调 if (nativeAdInfos == null || nativeAdInfos.size() == 0) { return; } NativeAdInfo nativeAdInfo = nativeAdInfos.get(0); if (nativeAdInfo != null) { // 注册视频监听 setVideoListener(nativeAdInfo); // 判断是否为视频类广告 if (nativeAdInfo.isVideo()) { // 获取视频视图控件 View videoView = nativeAdInfo.getMediaView(flMaterialContainer); // 添加进布局 TianmuViewUtil.addAdViewToAdContainer(flMaterialContainer, videoView); } else { ImageView imageView = new ImageView(flMaterialContainer.getContext()); ViewGroup.LayoutParams imageViewLayoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); // 获取图片并展示 TianmuSDK.getInstance().getImageLoader().loadImage(imageView.getContext(), nativeAdInfo.getImageUrl(), imageView); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setLayoutParams(imageViewLayoutParams); TianmuViewUtil.addAdViewToAdContainer(flMaterialContainer, imageView); } if (tvTitle != null) { // 设置标题 tvTitle.setText(nativeAdInfo.getTitle()); } if (tvDesc != null) { // 设置正文 tvDesc.setText(nativeAdInfo.getDesc()); } if (tvAdTarget != null) { // 设置渠道 tvAdTarget.setText(nativeAdInfo.getAdTarget()); } // 注册关闭事件 nativeAdInfo.registerCloseView(ivClose); // 注册视图和点击事件 nativeAdInfo.registerView(rlAdContainer, rlAdContainer); } } @Override public void onAdExpose(NativeAdInfo nativeAdInfo) { // 广告展示回调 } @Override public void onAdClick(NativeAdInfo nativeAdInfo) { // 广告点击回调 } @Override public void onAdClose(NativeAdInfo nativeAdInfo) { // 广告关闭回调 } @Override public void onAdFailed(TianmuError error) { // 广告失败回调 } }); nativeAd.loadAd(String posId); ``` > [信息流自渲染广告示例详情](https://gitee.com/admobile/tianmu-advertising-sdk-android/blob/master/app/src/main/java/com/tianmu/demo/ad/NativeAdActivity.java) ### 6.5 信息流模板广告 信息流模板广告,模板样式则是返回拼装好的广告视图,开发者只需将视图添加到相应容器即可,模板样式的容器高度建议是自适应。 **注意,信息流广告点击关闭时,开发者需要在onAdClose回调中将广告容器隐藏或移除``** #### 6.5.1 信息流模板广告主要 API **NativeExpressAd** com.tianmu.ad.NativeExpressAd | 方法名 | 介绍 | | ------------ | ---- | | NativeExpressAd(Context context, AdSize adSize) | 构造方法。参数说明:context(加载广告的上下文对象)、adSize(广告容器宽高)。| | setMute(boolean isMute) | 视频静音设置。参数说明:isMute(true:静音、false:不静音,默认:true)。| | setListener(NativeExpressAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。| | loadAd(String posId) | 请求广告。参数说明:posId(广告位ID)。| | release() | 释放广告。| **AdSize** com.tianmu.ad.entity.AdSize | 方法名 | 介绍 | | ------------ | ---- | | AdSize(int width, int height)| 构造方法。参数说明:
width(容器宽度,单位:px)请传入实际宽度、
height(容器高度,单位:px)建议传入0自适应高度。| **NativeExpressAdListener** com.tianmu.ad.listener.NativeExpressAdListener | 方法名 | 介绍 | | ------------ | ---- | | onAdReceive(List\ adInfos) | 广告加载成功回调。| | onAdExpose(NativeExpressAdInfo adInfo) | 广告展示回调。| | onAdClick(NativeExpressAdInfo adInfo) | 广告点击回调。| | onAdClose(NativeExpressAdInfo adInfo) | 广告关闭回调,在此回调中移除页面中的视图。| | onAdFailed(TianmuError error) | 广告失败回调。参数说明:error(广告错误信息)。| | onRenderFailed(NativeExpressAdInfo adInfo, TianmuError error) | 广告失败回调。参数说明:error(广告错误信息)。| **NativeExpressAdInfo** com.tianmu.ad.bean.NativeExpressAdInfo | 方法名 | 介绍 | | ------------ | ---- | | sendLossNotice(int price, @BidLossNotice int reason) | 竞败上报。参数说明:price(回传竞赢价格(ecpm),单位:分)、reason(竞败原因)。| | getBidPrice() | 获取竞价价格(ecpm),单位:分。| | getBidFloor() | 获取底价(ecpm),单位:分。| | isOvertime() | 广告是否超时(广告需要在10分钟内展示)。| | getNativeExpressAdView() | (已废弃)获取广告视图。| | getAdView() | (V3.1.1.4新增)获取广告视图。| | render() | 渲染广告,请在上述方法最后调用。| **VideoListener** com.tianmu.ad.listener.VideoListener | 方法名 | 介绍 | | ------------ | ---- | | onVideoStart(INativeAd nativeAd) | 视频播放开始回调。| | onVideoFinish(INativeAd nativeAd) | 视频播放完成回调。| | onVideoPause(INativeAd nativeAd) | 视频暂停回调。| | onVideoError(INativeAd nativeAd) | 视频播放异常。| #### 6.5.2 信息流模板广告接入示例 ```java NativeExpressAd nativeExpressAd = new NativeExpressAd(Context context, new AdSize(int width, int height)); nativeExpressAd.setListener(new NativeExpressAdListener() { @Override public void onRenderFailed(NativeExpressAdInfo nativeExpressAdInfo, TianmuError error) { // 广告渲染失败 } @Override public void onAdReceive(List nativeExpressAdInfos) { // 广告获取成功回调 if (nativeExpressAdInfos == null || nativeExpressAdInfos.size() == 0) { return; } NativeExpressAdInfo nativeExpressAdInfo = nativeExpressAdInfos.get(0); if (nativeExpressAdInfo != null) { // 获取广告视图 View view = nativeExpressAdInfo.getAdView(); // 将广告视图添加到容器中 ((ViewGroup) itemView).addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); // 渲染广告,一定要最后调用 nativeExpressAdInfo.render(); } } @Override public void onAdExpose(NativeExpressAdInfo nativeExpressAdInfo) { // 广告展示回调 } @Override public void onAdClick(NativeExpressAdInfo nativeExpressAdInfo) { // 广告点击回调 } @Override public void onAdClose(NativeExpressAdInfo nativeExpressAdInfo) { // 广告关闭回调 } @Override public void onAdFailed(TianmuError error) { // 广告失败回调 } }); nativeExpressAd.loadAd(String posId); ``` > [信息流模板广告示例详情](https://gitee.com/admobile/tianmu-advertising-sdk-android/blob/master/app/src/main/java/com/tianmu/demo/ad/NativeExpressAdActivity.java) ### 6.6 插屏广告示例 插屏广告是移动广告的一种常见形式,在应用流程中弹出,当应用展示插屏广告时,用户可以选择点击广告,也可以将其关闭并返回应用。 #### 6.6.1 插屏广告主要 API **InterstitialAd** com.tianmu.ad.InterstitialAd | 方法名 | 介绍 | | ------------ | ---- | | InterstitialAd(Context context) | 构造方法。参数说明:context(加载广告的上下文对象)。| | setMute(boolean isMute) | 视频静音设置。参数说明:isMute(true:静音、false:不静音,默认:true)。| | setListener(InterstitialAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。| | loadAd(String posId) | 请求广告。参数说明:posId(广告位ID)。| | setSensorDisable(boolean isSensorDisable) | 是否禁用传感器(可禁用摇一摇、扭一扭)。参数说明:isSensorDisable(true:禁用,false:启用,默认false)。| | setShowDirection(int showDirection) | 展示方向。参数说明:showDirection(TianmuConfig.ScreenOrientation.PORTRAIT:竖屏展示,TianmuConfig.ScreenOrientation.LANDSCAPE:横屏展示,默认竖屏展示)。| | setAutoClose(boolean autoClose) | 自动关闭插屏,默认5秒倒计时。参数说明:autoClose(true:启用、false:禁用,默认:false)。| | setAutoClose(boolean autoClose, int second) | 自动关闭插屏。参数说明:autoClose(true:启用、false:禁用,默认:false)、second(自动关闭时长,范围[3, 100]秒)。| | release() | 释放广告。| **InterstitialAdListener** com.tianmu.ad.listener.InterstitialAdListener | 方法名 | 介绍 | | ------------ | ---- | | onAdReceive(InterstitialAdInfo adInfo) | 广告加载成功回调。| | onAdExpose(InterstitialAdInfo adInfo) | 广告展示回调。| | onAdClick(InterstitialAdInfo adInfo) | 广告点击回调。| | onAdClose(InterstitialAdInfo adInfo) | 广告关闭回调。| | onVideoStart(InterstitialAdInfo adInfo) | 视频播放开始回调。| | onVideoFinish(InterstitialAdInfo adInfo) | 视频播放完成回调。| | onVideoPause(InterstitialAdInfo adInfo) | 视频暂停回调。| | onVideoError(InterstitialAdInfo adInfo) | 视频播放异常。| | onAdFailed(TianmuError error) | 广告失败回调。参数说明:error(广告错误信息)。| **InterstitialAdInfo** com.tianmu.ad.bean.InterstitialAdInfo | 方法名 | 介绍 | | ------------ | ---- | | sendLossNotice(int price, @BidLossNotice int reason) | 竞败上报。参数说明:price(回传竞赢价格(ecpm),单位:分)、reason(竞败原因)。| | getBidPrice() | 获取竞价价格(ecpm),单位:分。| | getBidFloor() | 获取底价(ecpm),单位:分。| | isOvertime() | 广告是否超时(广告需要在10分钟内展示)。| | showInterstitial(Activity activity) | (已废弃)展示广告。参数说明:activity(需要展示插屏的页面)。| | showAd(Activity activity) | (V3.1.1.4新增)展示广告。参数说明:activity(需要展示插屏的页面)。| #### 6.6.2 插屏广告接入示例 ```java InterstitialAd interstitialAd = new InterstitialAd(this); interstitialAd.setListener(new InterstitialAdListener() { @Override public void onAdReceive(InterstitialAdInfo interstitialAdInfo) { // 广告获取成功回调 if (interstitialAdInfo != null) { interstitialAdInfo.showAd(Activity activity); } } @Override public void onAdExpose(InterstitialAdInfo interstitialAdInfo) { // 广告展示回调 } @Override public void onAdClick(InterstitialAdInfo interstitialAdInfo) { // 广告点击回调 } @Override public void onAdClose(InterstitialAdInfo interstitialAdInfo) { // 广告关闭回调 } @Override public void onVideoStart(InterstitialAdInfo interstitialAdInfo) { // 视频开始播放 } @Override public void onVideoFinish(InterstitialAdInfo interstitialAdInfo) { // 视频播放完毕 } @Override public void onVideoPause(InterstitialAdInfo interstitialAdInfo) { // 视频暂停 } @Override public void onVideoError(InterstitialAdInfo interstitialAdInfo) { // 视频错误 } @Override public void onAdFailed(TianmuError error) { // 广告失败回调 } }); interstitialAd.loadAd(String posId); ``` > [插屏广告示例详情](https://gitee.com/admobile/tianmu-advertising-sdk-android/blob/master/app/src/main/java/com/tianmu/demo/ad/InterstitialAdActivity.java) ### 6.7 激励视频广告示例 将短视频融入到APP场景当中,用户观看短视频广告后可以给予一些应用内奖励。 #### 6.7.1 激励视频广告主要 API **RewardAd** com.tianmu.ad.RewardAd | 方法名 | 介绍 | | ------------ | ---- | | RewardAd(Context context) | 构造方法。参数说明:context(加载广告的上下文对象)。| | setMute(boolean isMute) | 视频静音设置。参数说明:isMute(true:静音、false:不静音,默认:true)。| | setSensorDisable(boolean isSensorDisable) | 是否禁用传感器(可禁用摇一摇、扭一扭)。参数说明:isSensorDisable(true:禁用,false:启用,默认false)。| | setShowDirection(int showDirection) | 展示方向。参数说明:showDirection(TianmuConfig.ScreenOrientation.PORTRAIT:竖屏展示,TianmuConfig.ScreenOrientation.LANDSCAPE:横屏展示,默认竖屏展示)。| | setServerVerificationExtraInfo(String data) | 设置服务端奖励回调。参数说明:data(服务端奖励参数)。| | setListener(RewardAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。| | loadAd(String posId) | 请求广告。参数说明:posId(广告位ID)。| | release() | 释放广告。| **RewardAdListener** com.tianmu.ad.listener.RewardAdListener | 方法名 | 介绍 | | ------------ | ---- | | onAdReceive(RewardAdInfo adInfo) | 广告加载成功回调。| | onAdExpose(RewardAdInfo adInfo) | 广告展示回调。| | onAdClick(RewardAdInfo adInfo) | 广告点击回调。| | onAdClose(RewardAdInfo adInfo) | 广告关闭回调。| | onAdReward(RewardAdInfo adInfo) | 广告奖励回调。| | onVideoStart(RewardAdInfo adInfo) | 视频播放开始回调。| | onVideoFinish(RewardAdInfo adInfo) | 视频播放完成回调。| | onVideoPause(RewardAdInfo adInfo) | 视频暂停回调。| | onVideoError(RewardAdInfo adInfo) | 视频播放异常。| | onAdFailed(TianmuError error) | 广告失败回调。参数说明:error(广告错误信息)。| **InterstitialAdInfo** com.tianmu.ad.bean.RewardAdInfo | 方法名 | 介绍 | | ------------ | ---- | | sendLossNotice(int price, @BidLossNotice int reason) | 竞败上报。参数说明:price(回传竞赢价格(ecpm),单位:分)、reason(竞败原因)。| | getBidPrice() | 获取竞价价格(ecpm),单位:分。| | getBidFloor() | 获取底价(ecpm),单位:分。| | isOvertime() | 广告是否超时(广告需要在10分钟内展示)。| | showRewardAd(Activity activity) | (已废弃) 展示广告。参数说明:activity(需要展示激励视频的页面)。| | showAd(Activity activity) | (V3.1.1.4新增)展示广告。参数说明:activity(需要展示激励视频的页面)。| #### 6.7.2 激励视频广告接入示例 ```java RewardAd rewardAd = new RewardAd(this); rewardAd.setListener(new RewardAdListener() { @Override public void onAdReceive(RewardAdInfo rewardAdInfo) { // 广告获取成功回调 if (rewardAdInfo != null) { rewardAdInfo.showAd(Activity activity); } } @Override public void onAdReward(RewardAdInfo rewardAdInfo) { // 广告奖励回调 } @Override public void onAdExpose(RewardAdInfo rewardAdInfo) { // 广告展示回调 } @Override public void onAdClick(RewardAdInfo rewardAdInfo) { // 广告点击回调 } @Override public void onAdClose(RewardAdInfo rewardAdInfo) { // 广告关闭回调 } @Override public void onVideoCompleted(RewardAdInfo rewardAdInfo) { // 视频播放完毕回调 } @Override public void onVideoSkip(RewardAdInfo rewardAdInfo) { // 视频跳过回调 } @Override public void onVideoError(RewardAdInfo rewardAdInfo, String msg) { // 视频播放错误回调 } @Override public void onAdFailed(TianmuError error) { // 广告失败回调 } }); rewardAd.loadAd(String posId); ``` > [激励视频广告示例详情](https://gitee.com/admobile/tianmu-advertising-sdk-android/blob/master/app/src/main/java/com/tianmu/demo/ad/RewardAdActivity.java) ### 6.8 创新广告示例 创新广告建议放置在 **RelativeLayout中**。 #### 6.8.1 创新广告主要 API **SuspendAd** com.tianmu.ad.SuspendAd | 方法名 | 介绍 | | ------------ | ---- | | SuspendAd(Context context, ViewGroup container) | 构造方法。参数说明:context(当前页面上下文对象)、container(展示广告视图的父容器)。| | setAutoRefresh(long seconds) | 设置自刷新时间间隔。参数说明:seconds(其他取值范围为[10,3600],单位秒。传入0将不自刷新)。| | setListener(SuspendAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。| | setAdSize(AdSize adSize) |(已废弃) 升级后广告显示大小随广告视图的父容器自动变换。| | setStyle(int style) | 设置广告广告样式。参数说明:Config.CreativeStyle.PIC 非标广告、Config.CreativeStyle.TEXT 文字链广告(单行)、Config.CreativeStyle.TEXT_VERTICAL 文字链广告、Config.CreativeStyle.TEXT_AVATAR 头像广告、Config.CreativeStyle.SELF_RENDING 自渲染广告,默认:Config.CreativeStyle.PIC。| | setContainerPadding(int left, int top, int right, int bottom) | 设置布局内边距。参数说明:left(左边距,单位:dp)、top(上边距,单位:dp)、right(右边距,单位:dp)、bottom(底边距,单位:dp)。| | setContainerRadius(float leftTop, float rightTop, float leftBottom, float rightBottom) | 设置布局圆角半径。参数说明:leftTop(左上角,单位:dp)、rightTop(右上角,单位:dp)、leftBottom(左下角,单位:dp)、rightBottom(右下角,单位:dp)。| | setHideBackground(boolean isHideBackground) | 设置背景是否显示。参数说明:isHideBackground。| | setBackgroundColor(String colorString) | 设置自定义背景颜色。参数说明:colorString (背景颜色,示例:#d1d1d1)。| | setFontSize(float fontSize) | 设置文字大小。参数说明:fontSize(字体大小)。| | setFontColor(String fontColor) | 设置文字颜色。参数说明:fontColor(文字颜色,示例:#d1d1d1)。| | setTextPadding(int left, int top, int right, int bottom) | 设置内容内边距。参数说明:left(左边距,单位:dp)、top(上边距,单位:dp)、right(右边距,单位:dp)、bottom(底边距,单位:dp)。| | setTextAutoScroll(boolean isAutoScroll) | 设置内容是否自动滚动。参数说明:isAutoScroll(true:滚动、false:不滚动,默认:false)。| | setTextShowEllipsis(boolean isShowEllipsis) | 设置内容结尾是否显示省略号。参数说明:isShowEllipsis(true:显示、false:不显示,默认:true)。| | setLogoSize(int width, int height) | 设置广告角标大小。参数说明:width(宽,单位:dp)、height(高,单位:dp)。| | setLogoHide(boolean isHide) | 设置广告角标是否隐藏。参数说明:isHide(true:隐藏、false:不隐藏,默认:false)。| | setCloseSize(int width, int height) | 设置关闭按钮大小。参数说明:width(宽,单位:dp)、height(高,单位:dp)。| | setCloseHide(boolean isHide) | 设置关闭按钮是否隐藏。参数说明:isHide(true:隐藏、false:不隐藏,默认:false)。| | loadAd(String posId) | 请求广告并展示。参数说明:posId(广告位ID)。| | pause() | 暂停广告自刷新,请根据页面生命周期调用。| | resume() | 恢复广告自刷新,请根据页面生命周期调用。| | release() | 释放广告。| **SuspendAdListener** com.tianmu.ad.listener.SuspendAdListener | 方法名 | 介绍 | | ------------ | ---- | | onAdReceive(SuspendAdInfo adInfo) | 广告加载成功回调。| | onAdExpose(SuspendAdInfo adInfo) | 广告展示回调。| | onAdClick(SuspendAdInfo adInfo) | 广告点击回调。| | onAdClose(SuspendAdInfo adInfo) | 广告关闭回调,开发者需要在此回调中对广告父视图进行隐藏或移除子视图,并对广告对象进行释放,避免自刷新逻辑持续进行| | onAdFailed(TianmuError error) | 广告失败回调。参数说明:error(广告错误信息)。| **SuspendAdInfo** com.tianmu.ad.bean.SuspendAdInfo | 方法名 | 介绍 | | ------------ | ---- | | getTitle() | 广告标题。| | getDesc() | 广告描述。| | getImageUrl() | 广告图片。| | getAdTarget() | 广告标识。| | registerView(ViewGroup viewGroup, View... views) | 注册自渲染视图曝光和点击事件。参数说明:viewGroup(曝光检测视图)、views(广告可被点击视图)。| | registerCloseView(View closeView) | 注册自渲染关闭按钮。| #### 6.8.2 创新广告加载并展示 ```java // 创建创新广告实例,第一个是context上下文对象,第二个参数是广告容器(请保证容器不会拦截点击、触摸等事件) SuspendAd suspendAd = new SuspendAd(Context context, ViewGroup container); SuspendAd.setStyle(Config.CreativeStyle.PIC); // 文字自动滚动 SuspendAd.setTextAutoScroll(isAutoScroll); // 是否显示背景 SuspendAd.setHideBackground(isHideBackground); // 自定义背景色 SuspendAd.setBackgroundColor(colorString); //设置自动刷新时间 SuspendAd.setAutoRefresh(autoRefreshInterval); // 设置创新广告监听 suspendAd.setListener(new SuspendAdListener() { @Override public void onAdReceive(SuspendAdInfo adInfo) { // 广告获取成功回调... } @Override public void onAdExpose(SuspendAdInfo adInfo) { // 广告展示回调,有展示回调不一定是有效曝光,如网络等情况导致上报失败 } @Override public void onAdClick(SuspendAdInfo adInfo) { // 广告点击回调,有点击回调不一定是有效点击,如网络等情况导致上报失败 } @Override public void onAdClose(SuspendAdInfo adInfo) { // 广告关闭回调,开发者需要在此回调中对广告父视图进行隐藏或移除子视图, // 并对广告对象进行释放,避免自刷新逻辑持续进行 if (suspendAd != null) { suspendAd.release(); suspendAd = null; } } @Override public void onAdFailed(TianmuError error) { // 广告获取失败回调... } }); // 加载创新广告,参数为广告位ID,同一个对象只有一次loadAd有效 suspendAd.loadAd(String posId); ``` #### 6.8.3 创新广告自渲染接入示例 使用 `Config.CreativeStyle.SELF_RENDING` 时,SDK 不会直接生成默认广告样式。开发者需要在 `onAdReceive` 中通过 `SuspendAdInfo` 获取素材、填充自定义布局,并调用 `registerView` 和 `registerCloseView` 完成曝光、点击和关闭事件注册。 ```java // 创建创新广告实例,第一个是context上下文对象,第二个参数是广告容器(请保证容器不会拦截点击、触摸等事件) SuspendAd suspendAd = new SuspendAd(Context context, ViewGroup container); suspendAd.setStyle(Config.CreativeStyle.SELF_RENDING); suspendAd.setListener(new SuspendAdListener() { @Override public void onAdReceive(SuspendAdInfo adInfo) { if (adInfo == null) { return; } ViewGroup selfRenderView = (ViewGroup) getLayoutInflater().inflate( R.layout.item_suspend_self_render2, container, false); TextView titleView = selfRenderView.findViewById(R.id.tvTitle); TextView descView = selfRenderView.findViewById(R.id.tvDesc); TextView adTargetView = selfRenderView.findViewById(R.id.tvAdTarget); ImageView imageView = selfRenderView.findViewById(R.id.imBackground); ImageView closeView = selfRenderView.findViewById(R.id.tvClose); if (titleView != null && !TextUtils.isEmpty(adInfo.getTitle())) { titleView.setText(adInfo.getTitle()); } if (descView != null && !TextUtils.isEmpty(adInfo.getDesc())) { descView.setText(adInfo.getDesc()); } if (adTargetView != null && !TextUtils.isEmpty(adInfo.getAdTarget())) { adTargetView.setText(adInfo.getAdTarget()); } if (imageView != null && !TextUtils.isEmpty(adInfo.getImageUrl())) { Glide.with(imageView.getContext()) .load(adInfo.getImageUrl()) .into(imageView); } adInfo.registerView(selfRenderView, selfRenderView); if (closeView != null) { adInfo.registerCloseView(closeView); } } @Override public void onAdExpose(SuspendAdInfo adInfo) { // 广告展示回调 } @Override public void onAdClick(SuspendAdInfo adInfo) { // 广告点击回调 } @Override public void onAdClose(SuspendAdInfo adInfo) { if (suspendAd != null) { suspendAd.release(); } } @Override public void onAdFailed(TianmuError error) { // 广告获取失败回调... } }); suspendAd.loadAd(String posId); ``` #### 6.8.4 创新广告生命周期处理 ```java //页面声明周期方法 @Override protected void onResume() { super.onResume(); if (mSuspensionAd != null) { mSuspensionAd.resume(); } } @Override protected void onPause() { super.onPause(); if (mSuspensionAd != null) { mSuspensionAd.pause(); } } private void releaseAd() { if (mSuspensionAd != null) { mSuspensionAd.release(); mSuspensionAd = null; } } ``` > [创新广告示例详情](https://gitee.com/admobile_top/tianmudemo_android/blob/main/app/src/main/java/com/tianmu/demo/ad/TextAdActivity.java) ### 6.9 备注 具体的接入代码和流程,请参考Demo ## 7. 常见问题和错误调试 > [常见问题和错误调试及错误码](https://gitee.com/admobile/tianmu-advertising-sdk-android/blob/master/ErrorCode/TianmuErrorCode.md) ## 8.商务合作 邮箱 : yuxingcao@admobile.top