# ADJgSdk-Android
**Repository Path**: jiguang-official/adjg-sdk-android
## Basic Information
- **Project Name**: ADJgSdk-Android
- **Description**: 广告聚合SdkDemo-Android
- **Primary Language**: Java
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 6
- **Forks**: 0
- **Created**: 2022-05-09
- **Last Updated**: 2025-09-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ADJgSdk Android Sdk——接入文档 V4.0.1.06033
目录
[TOC]
## 1. 概述
### 1.1 概述
尊敬的开发者朋友,欢迎您使用ADJg广告聚合SDK。通过本文档,您可以快速完成多平台广告SDK的集成。
**注意:本SDK仅支持中国大陆地区**;如需发布到Google Play,请勿引入本SDK及相关依赖文件。
### 1.2 ADJg广告聚合SDK 组成结构
ADJg广告聚合SDK主要由**ADJg核心SDK(简称ADJgSdk)**和一个或多个**三方平台适配器SDK(简称AdapterSdk)**组成,开发者可以自由的在后台配置中选择需要接入的三方广告平台,然后导入所对应的AdapterSdk,其中**天目平台的AdapterSdk是必须导入的**。
### 1.3 三方广告平台名称概述
| Name | 平台名称 | 平台别称 |
| --------- | -------- | -------- |
| jgads | 极光Ads | 极光Ads |
| tianmu | 天目 | 天目 |
| gdt | 优量汇 | 优量汇 |
| toutiao | 头条 | 穿山甲 |
| baidu | 百度 | 百青藤 |
| ksad | 快手 | 快手 |
| beizi | 倍孜 | 倍孜 |
| octopus | 章鱼 | 章鱼 |
| huiying | 汇盈 | 汇盈 |
### 1.4 ADJg必添包容量
| Name | 大小 | 版本号 |
| --------- | ----- | ------------ |
| ADJg基础包 | 0.30M | V4.0.1.06033 |
| OAID | 1.10M | — |
| OAID适配器 | 0.03M | 1.0.25.12122 |
### 1.5 三方广告平台适配器+三方广告sdk总容量
| Name | 容量 | 版本号 | 备注 |
| --------- | -------- | ----------------- | -- |
| jgads | 1.50M | v3.0.1.06192 | |
| tianmu | 1.80M | v3.0.2.08131 | |
| gdt | 1.94M | v4.642.1512.07241 | |
| toutiao | 7.03M | v7.0.0.8.07241 | |
| baidu | 1.74M | v9.394.07241 | 此版本开始仅支持AndroidX |
| ksad | 4.25M | v4.6.30.1.07241 | |
| beizi | 2.01M | v5.2.1.20.07211 | |
| octopus | 1.06M | v1.6.3.8.06192 | |
| huiying | 1.20M | v1.5.3.8.08251 | |
| gromore | 0.05M | v7.0.0.8.08261 | 不包含穿山甲 |
## 2. 支持的广告类型
### 2.1 普通广告
类型 |
简介 |
适用场景 |
开屏广告 |
开屏广告以APP启动作为曝光时机的模板广告,需要将开屏广告视图添加到承载的广告容器中,提供5s可感知广告展示 |
APP启动界面常会使用开屏广告 |
Banner广告 |
Banner广告是横向贯穿整个可视页面的模板广告,需要将Banner广告视图添加到承载的广告容器中 |
任意界面的固定位置,不建议放在RecyclerView、List这种滚动布局中当item |
信息流广告 |
信息流广告集合原生自渲染广告和模板广告两种,可以通过后台配置和SDK相关方法判断进行不同的渲染,以满足不同的样式需求 |
信息流列表,轮播控件,固定位置都是较为适合 |
激励视频广告 |
将短视频融入到APP场景当中,用户观看短视频广告后可以给予一些应用内奖励 |
常出现在游戏的复活、任务等位置,或者网服类APP的一些增值服务场景 |
插屏广告 |
插屏广告是移动广告的一种常见形式,在应用流程中弹出,当应用展示插屏广告时,用户可以选择点击广告,访问其目标网址,也可以将其关闭并返回应用 |
在应用执行流程的自然停顿点,适合投放这类广告 |
### 2.2 倍孜广告接入注意
由于引入的倍孜 sdk 支持的最小版本与 app 支持的最小版本可能不一致,需要在 AndroidManifest 文件中添加如下代码:
```java
```
## 3. Demo及SDK下载链接
> 请参考文档
## 4. SDK版本说明
### 4.1 ADJgSdk版本号说明
版本号格式为3.0.0.xxxxn,其中xxxx代表日期,最后一位n为版本扩展号;
### 4.2 AdapterSdk版本号说明
版本号格式为 y.y.xxxxn,y.y代表三方SDK版本号(可能两位、也可能三位、四位...),其中xxxx代表日期,最后一位n为版本扩展号;
### 4.3 AdapterSdk和ADJgSdk版本对应说明
AdapterSdk会指定支持的ADJgSdk版本,**如果导入的AdapterSdk和ADJgSdk版本不对应会抛出异常提醒开发者使用相对应的版本**;
## 5. SDK接入流程
### 5.1 添加SDK到工程中
接入环境:**Android Studio**。
#### 5.1.1 添加仓库地址
首先需要在项目的build.gradle文件中引入如下配置:
```java
allprojects {
repositories {
...
// 极光仓库
maven { url 'https://s01.oss.sonatype.org/content/repositories/releases/' }
google()
jcenter()
mavenCentral()
}
}
```
#### 5.1.2 添加ADJgSdk和需要的AdapterSdk
将广告所需要的依赖集成进去,AdapterSdk可根据接入平台情况进行选择接入。
```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'
// ADJg主SDK ,必须的
implementation "cn.jiguang.sdk.ad:core:4.0.1.06033"
// OAID1.0.25版本适配器不支持其它版本,ADJgSdk获取oaid使用
implementation "cn.jiguang.sdk.ad:oaid:1.0.25.12122"
// OAID库1.0.25
implementation(name: 'oaid_sdk_1.0.25', ext: 'aar')
// 极光Ads适配器,必须的
implementation "cn.jiguang.sdk.ad.adapter:jgads:3.0.1.06192"
// 天目适配器,必须的
implementation "cn.jiguang.sdk.ad.adapter:tianmu:3.0.2.08131"
// 优量汇适配器,可选的
implementation "cn.jiguang.sdk.ad.adapter:gdt:4.642.1512.07241"
// 头条适配器,可选的
implementation "cn.jiguang.sdk.ad.adapter:toutiao:7.0.0.8.07241"
// Gromore适配器,可选的
implementation 'cn.jiguang.sdk.ad.adapter:gromore-without:7.0.0.8.08261'
// 百度适配器,仅支持androidx版本,可选的
implementation "cn.jiguang.sdk.ad.adapter:baidu-androidx:9.394.07241"
// 快手适配器,可选的
implementation "cn.jiguang.sdk.ad.adapter:ksadbase:4.6.30.1.07241"
// 倍孜适配器,可选的
implementation 'cn.jiguang.sdk.ad.adapter:beizi:5.2.1.20.07211'
// 章鱼适配器,可选的
implementation 'cn.jiguang.sdk.ad.adapter:octopus:1.6.3.8.06192'
// 汇盈适配器
implementation 'cn.jiguang.sdk.ad.adapter:huiying:1.5.3.8.08251'
// 汇盈sdk必须引入内容
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.googlecode.android-query:android-query:0.25.9'
implementation 'com.android.support:cardview-v7:21.0.0'
}
```
#### 5.1.3 注意事项
* 支持主流架构,x86架构暂不支持
```java
ndk {
// 设置支持的SO库架构,暂不支持x86
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
```
* **AdapterSdk默认已经集成了三方的广告SDK**,如果因为项目中也使用了相同的三方广告SDK而发生冲突,可通过以下方法尝试避免或解决;
1. 移除己方使用的三方广告SDK和相关配置;
2. 使用**AdapterSdk**的**without**集成方式,该方式没有集成三方广告SDK和配置,开发者可自行集成三方广告SDK,但是需要注意,我们的AdapterSdk是基于三方广告SDK某个版本开发的,如果自行集成三方广告SDK,需要承担三方广告SDK版本不一致可能引起的兼容性和其他不可预知问题;
```java
// 优量汇AdapterSdk的without集成示例,其中x.x.x.x为AdapterSdk版本号
implementation 'cn.jiguang.sdk.ad.adapter:gdt-without:x.x.x.x'
```
3. 激励、全屏视频、插屏等广告对象一次成功拉取的广告数据只允许展示一次,还需展示请再次加载广告。
### 5.2 OAID1.0.25版本支持
**Android10之后IMEI等数据无法获取,这对广告投放将产生一定影响,所以移动安全联盟(MSA)提出OAID来代替IMEI参与广告投放决策,OAID的支持会在一定程度上影响广告收益;**
**OAID是必须集成项,没有集成将会抛出异常提醒开发者**,OAID集成并不繁琐,SDK中已经进行了OAID1.0.25的封装适配,只需以下几步即可完成OAID的支持;
1. 导入安全联盟的OAID支持库 **oaid_sdk_1.0.25.aar**,可在Demo的libs目录下找到,**对接其它版本请勿参考该教程;**
2. 将Demo中assets文件夹下的**supplierconfig.json**文件复制到自己的assets目录下并按照**supplierconfig.json**文件中的说明进行OAID的 **AppId** 配置,**supplierconfig.json**文件名不可修改。需要设置 appid 的部分需要去对应厂商的应用商店的应用信息中查看;
3. 添加以下混淆配置;
```java
-keep class com.bun.miitmdid.core.** {*;}
-keep class XI.CA.XI.**{*;}
-keep class XI.K0.XI.**{*;}
-keep class XI.XI.K0.**{*;}
-keep class XI.vs.K0.**{*;}
-keep class XI.xo.XI.XI.**{*;}
-keep class com.asus.msa.SupplementaryDID.**{*;}
-keep class com.asus.msa.sdid.**{*;}
-keep class com.bun.lib.**{*;}
-keep class com.bun.miitmdid.**{*;}
-keep class com.huawei.hms.ads.identifier.**{*;}
-keep class com.samsung.android.deviceidservice.**{*;}
-keep class com.zui.opendeviceidlibrary.**{*;}
-keep class org.json.**{*;}
-keep public class com.netease.nis.sdkwrapper.Utils {public ;}
```
4. 修改AndroidManifest.xml,**OAID SDK minSdkVersion为21,如果应用的minSdkVersion小于21,则添加:**
```java
// 如果导入后有冲突可以不添加,sdk中已经添加过了
```
**注意:使用其它版本oaid请移除以下依赖,避免造成崩溃:**
```java
// OAID1.0.25版本适配器不支持其它版本,ADJgSdk获取oaid使用
implementation "cn.jiguang.sdk.ad:oaid:1.0.25.12122"
// OAID库1.0.25
implementation(name: 'oaid_sdk_1.0.25', ext: 'aar')
```
5. 使用其它版本参考案例
[Oaid高版本参考案例](https://gitee.com/jiguang-official/adjg-oaid-docking-case)
### 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
-ignorewarnings
# v4、v7(如果是Support支持库需添加)
-keep class android.support.v4.**{public *;}
-keep class android.support.v7.**{public *;}
# AndroidX (如果是AndroidX支持库需添加)
-keep class com.google.android.material.** {*;}
-keep class androidx.** {*;}
-keep class * extends androidx.**
# 资源文件混淆配置
-keep class **.R$* { *; }
-keep public class **.R$*{
public static final int *;
}
-keepclassmembers class **.R$* {
public static ;
}
# ADJgSdk混淆
-dontwarn cn.jiguang.jgssp.**
-dontwarn org.apache.commons.**
-keep class cn.jiguang.jgssp.**{public *;}
-keep class com.android.**{*;}
-keep class com.ciba.**{ *; }
-keep class org.apache.**{*;}
# okhttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}
# OAID混淆
-keep class com.bun.miitmdid.core.** {*;}
-keep class XI.CA.XI.**{*;}
-keep class XI.K0.XI.**{*;}
-keep class XI.XI.K0.**{*;}
-keep class XI.vs.K0.**{*;}
-keep class XI.xo.XI.XI.**{*;}
-keep class com.asus.msa.SupplementaryDID.**{*;}
-keep class com.asus.msa.sdid.**{*;}
-keep class com.bun.lib.**{*;}
-keep class com.bun.miitmdid.**{*;}
-keep class com.huawei.hms.ads.identifier.**{*;}
-keep class com.samsung.android.deviceidservice.**{*;}
-keep class org.json.**{*;}
-keep public class com.netease.nis.sdkwrapper.Utils {public ;}
# 优量汇广告平台混淆
-keep class com.qq.e.** {public protected *;}
-keep class MTT.ThirdAppInfoNew {*;}
-keep class com.tencent.** {*;}
# 百度广告SDK混淆
-keepclassmembers class * extends android.app.Activity { public void *(android.view.View);}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class com.baidu.mobads.** { *; }
-keep class com.baidu.mobad.** { *; }
# 头条广告平台混淆
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-keep class com.bytedance.sdk.openadsdk.** {*;}
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.pgl.sys.ces.* {*;}
-keep class com.bytedance.embed_dr.** {*;}
-keep class com.bytedance.embedapplog.** {*;}
# mintegral广告平台混淆
-dontwarn com.mintegral.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.mbridge.** {*; }
-keep interface com.mbridge.** {*; }
-keep class android.support.v4.** { *; }
-dontwarn com.mbridge.**
-keep class **.R$* { public static final int mbridge*; }
# 快手广告平台混淆
-keep class org.chromium.** { *; }
-keep class aegon.chrome.** { *; }
-keep class com.kwai.**{ *; }
-keep class com.kwad.**{ *; }
-dontwarn com.kwai.**
-dontwarn com.kwad.**
-dontwarn com.ksad.**
-dontwarn aegon.chrome.**
-keep class com.kwad.sdk.** { *;}
-keep class com.ksad.download.** { *;}
-keep class com.kwai.filedownloader.** { *;}
-keepclasseswithmembernames class * { native ;}
# 极光Ads混淆
-keep class com.junion.**{ *; }
-keep class junion.com.** { *; }
-keep interface junion.com.** { *; }
# 天目广告混淆
-keep class com.tianmu.**{ *; }
-keep class tianmu.com.** { *; }
-keep interface tianmu.com.** { *; }
# Jgid的混淆规则
-keep class jgssp.com.** { *; }
-keep interface jgssp.com.** { *; }
#倍孜Beizi广告混淆
-dontwarn android.app.**
-dontwarn android.support.**
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontwarn org.apache.**
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-dontwarn com.beizi.fusion.**
-dontwarn com.beizi.ad.**
-keep class com.beizi.fusion.** {*; }
-keep class com.beizi.ad.** {*; }
# 章鱼的混淆规则
-dontwarn com.octopus.ad.**
-keep class com.octopus.ad.** {*;}
# 汇盈的混淆规则
-keep class cn.haorui.sdk.** { *; }
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
```
#### 5.4.3 开启硬件加速,优化视频类广告播放效果。
```java
... ...
```
### 5.5 隐私信息控制开关
**为了保证您的App顺利通过检测,结合当前监管关注重点,请务必将ADJgSdk的初始化放在用户同意隐私政策之后。**
**如合规有更高要求,可以使用以下方法进行控制,但会严重降低广告收益,可根据实际需求进行设置,或联系我发运营人员获取建议。**
同时ADJgSDK初始化时开放以下接口,确保mac,imei等设备标识不被读取(目前部分三方广告平台支持):
```java
//【慎改】是否同意隐私政策,将禁用一切设备信息读起严重影响收益
.agreePrivacyStrategy(false)
// 是否可获取定位数据
.isCanUseLocation(false)
// 是否可获取设备信息
.isCanUsePhoneState(false)
// 是否可读取设备安装列表
.isCanReadInstallList(false)
// 是否可读取设备外部读写权限
.isCanUseReadWriteExternal(false)
// 是否可读取WIFI信息
.isCanUseWifiState(false)
// 是否可使用OAID
.isCanUseOaid(false)
// 是否允许使用传感器
.isCanUseSensor(false)
```
另外还可从根源上解决设备标识被读取等问题,可对配置清单中的权限增加tools:node="remove"配置;
如下:
```java
```
以上操作会对广告填充造成影响,请斟酌使用。
### 5.6 个性化开关
ADJg的个性化开关可统一控制第三方广告SDK的个性化开关接口,目前支持天目、优量汇、穿山甲、百度、快手;
```java
// true为开启、false为关闭,请在初始化ADJg后进行控制
ADJgSdk.setPersonalizedAdEnabled(boolean personalized);
```
### 5.7 向SDK传入设备标识
统一由可选参数 : CustomDeviceInfoController 进行设置
- 新增可选参数设置
```java
ADJgSdk.getInstance().init(
this,
new ADJgInitConfig.Builder()
...
// 是否可读取wifi状态
.isCanUseWifiState(false)
// 是否可获取定位数据
.isCanUseLocation(false)
// 是否可获取设备信息
.isCanUsePhoneState(false)
.setCustomDeviceInfoController(new CustomDeviceInfoController() {
/**
* 当isCanUsePhoneState=false时,可传入imei信息,使用您传入的imei信息
* @return imei信息
*/
@Override
public String getImei() {
return super.getImei();
}
/**
* 当isCanUsePhoneState=false时,可传入AndroidId信息,使用您传入的AndroidId信息
* @return androidid信息
*/
@Override
public String getAndroidId() {
return super.getAndroidId();
}
/**
* 当isCanUseLocation=false时,可传入地理位置信息,使用您传入的地理位置信息
* @return 极光地理位置参数JUnionLocationProvider
*/
@Override
public Location getLocation() {
return super.getLocation();
}
/**
* 当isCanUseWifiState=false时,可传入Mac地址信息,使用您传入的Mac地址信息
* @return Mac地址
*/
@Override
public String getMacAddress() {
return super.getMacAddress();
}
/**
* 开发者可以传入oaid ,若不传或为空值,则不使用oaid信息
* @return oaid
*/
@Override
public String getOaid() {
return super.getOaid();
}
/**
* 开发者可以传入vaid ,若不传或为空值,则不使用vaid信息
* @return vaid
*/
@Override
public String getVaid() {
return super.getVaid();
}
})
...
.build()
);
```
### 5.8 三方广告隐私开关单独控制
> [汇盈](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/汇盈隐私控制开关.md)
## 6. 示例代码
### 6.1 SDK初始化
在隐私同意后进行SDK的初始化(详情请参考Demo SplashAdActivity.java类)
#### 6.1.1 初始化主要 API
**ADJgSdk**
cn.jiguang.jgssp.ADJgSdk
| 方法名 | 介绍 |
| ------------ | ---- |
| init(Context context, ADJgInitConfig config) | 构造方法。参数说明:context(初始化SDK请传入Application的上下文对象)、config(初始化配置信息)。|
| init(Context context, ADJgInitConfig config, ADJgInitListener listener) | 构造方法。参数说明:context(初始化SDK请传入Application的上下文对象)、config(初始化配置信息)、listener(初始化状态监听)。|
| setPersonalizedAdEnabled(boolean enablePersonalized) | 设置个性化推荐开关。参数说明:enablePersonalized(true:开启,false:关闭, 默认:true)。|
| getPersonalizedAdEnabled() | 获取个性化推荐状态,true:开启,false:关闭。 |
**ADJgInitConfig**
cn.jiguang.jgssp.config.ADJgInitConfig
| 方法名 | 介绍 |
| ------------ | ---- |
| appId(String appId) | 设置AppId,必填参数。|
| debug(boolean debug) | 设置是否是Debug模式。参数说明:debug(true:开启,false:关闭, 默认:false)开发阶段以及提交测试阶段可设置为true,方便异常排查。|
| isCanUseSensor(boolean isCanUseSensor) | 设置SDK是否可以使用传感器信息。参数说明:isCanUseSensor(true:开启,false:关闭, 默认:false,建议媒体升级后调用该方法开启。目前仅支持控制优量汇、快手、天目、极光Ads,其中优量汇、天目、极光Ads可控制所有广告类型,快手仅支持控制开屏,其他渠道需要到对应后台控制或提交工单关闭,关闭后将影响广告点击率)。|
| 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)。|
| filterThirdQuestion(boolean filterThirdQuestion) | 设置是否过滤第三方平台的问题广告(例如: 已知某个广告平台在某些机型的Banner广告可能存在问题,如果开启过滤,则在该机型将不再去获取该平台的Banner广告)。参数说明:filterThirdQuestion(true:开启,false:关闭, 默认:true)。|
| setCustomDeviceInfoController(CustomDeviceInfoController controller) | 自定义设备信息。可选参数。 请参考5.7 向SDK传入设备标识 |
| setWXAppId(String wxAppId) | 设置微信AppId。可选参数。参数说明:wxAppId(微信AppId)|
**CustomDeviceInfoController**
cn.jiguang.jgssp.config.CustomDeviceInfoController
| 方法名 | 介绍 |
| ------------ | ---- |
| getImei() | 当isCanUsePhoneState=false时,可传入imei信息,使用您传入的imei信息。|
| getAndroidId() | 当isCanUsePhoneState=false时,可传入AndroidId信息,使用您传入的AndroidId信息。|
| getLocation() | 当isCanUseLocation=false时,可传入地理位置信息,使用您传入的地理位置信息。|
| getMacAddress() | 当isCanUseWifiState=false时,可传入Mac地址信息,使用您传入的Mac地址信息。|
| getOaid() | 开发者可以传入oaid ,若不传或为空值,则不使用oaid信息。|
| getVaid() | 开发者可以传入vaid ,若不传或为空值,则不使用vaid信息。|
#### 6.1.2 初始化接入示例
```java
// 初始化ADJg广告SDK
ADJgSdk.getInstance().init(this, new ADJgInitConfig.Builder()
// 设置APPID,必须的
.appId(String appId)
// 是否开启Debug,开启会有详细的日志信息打印,如果用上ADJgToastUtil工具还会弹出toast提示。
// 注意上线后请置为false
.debug(boolean debug)
...
.build());
```
PS :AppId通过后台配置生成,初始化必须在主线程中进行,SDK暂不支持多进程。
### 6.2 开屏广告示例
开屏广告建议在闪屏页进行展示,开屏广告的宽度和高度取决于容器的宽高,都是会撑满广告容器;**开屏广告的高度必须大于等于屏幕高度(手机屏幕完整高度,包括状态栏之类)的75%**,否则可能会影响收益计费(优量汇的开屏甚至会影响跳过按钮的回调)。
#### 6.2.1 开屏广告主要 API
**ADJgSplashAd**
cn.jiguang.jgssp.ad.ADJgSplashAd
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgSplashAd(Activity activity) | 构造方法。参数说明:activity(当前页面activity对象)。|
| ADJgSplashAd(Fragment fragment) | 构造方法。参数说明:fragment(当前页面fragment对象)。|
| ADJgSplashAd(Activity activity, ViewGroup container) | 构造方法。参数说明:activity(当前页面activity对象)、container(展示广告视图的父容器)。|
| ADJgSplashAd(Fragment fragment, ViewGroup container) | 构造方法。参数说明:fragment(当前页面fragment对象)、container(展示广告视图的父容器)。|
| ADJgSplashAd(Context context) | 构造方法。参数说明:context(上下文对象)。注意:若使用该方法构造开屏广告对象,请使用loadOnly去加载广告。|
| setLocalExtraParams(ADJgExtraParams extraParams) | 设置额外参数。参数说明:extraParams(广告额外参数)。|
| setImmersive(boolean isImmersive) | 设置沉浸效果。参数说明:isImmersive(true:沉浸,false:不沉浸,影响跳过按钮位置)。|
| setOnlySupportPlatform(String platform) | 设置广告定向,仅请求某一渠道。参数说明:platform(渠道名)。注:仅debug模式为true时生效。|
| setListener(ADJgSplashAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。|
| loadAd(String posId) | 请求广告并展示。参数说明:posId(广告位ID)。|
| loadOnly(String posId) | 仅请求广告不展示。参数说明:posId(广告位ID)。|
| loadAd(String posId, ADJgNetworkRequestInfo requestInfo) | 请求打底广告并展示,目前支持优量汇、头条、百度、快手。参数说明:posId(广告位ID)、requestInfo(打底广告对象,接口地址[Gitee地址](https://gitee.com/admobile/ADJgSdkDemo-Android/blob/master/README-ADJgNetworkRequestInfo.md)、[Github地址](https://github.com/ADJg/ADJgSdkDemo-Android/blob/master/README-ADJgNetworkRequestInfo.md))。|
| showSplash() | 展示广告。使用loadOnly方法去加载广告时,可在onAdReceive回调后去展示广告。|
| showSplash(ViewGroup container) | 展示广告。参数说明:container(广告展示父容器)。通过ADJgSplashAd(Activity activity)、ADJgSplashAd(Fragment fragment)构造广告对象,并使用loadOnly方法加载广告时,可在onAdReceive回调后调用该方法去展示广告。|
| release() | 释放广告。注意:若通过ADJgSplashAd(Context context)去构造开屏广告对象,请在不使用广告时调用此方法释放广告|
**ADJgExtraParams**
cn.jiguang.jgssp.ad.entity.ADJgExtraParams
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgExtraParams.Builder().build() | 构造方法。|
| adSize(ADJgAdSize adSize) | 设置开屏视图宽高。参数说明:adSize(设置整个广告视图预期宽高(目前头条和倍孜平台需要,没有接入头条和倍孜平台可不设置),单位为px,如果不设置头条开屏广告视图将会以9 : 16的比例进行填充,小屏幕手机可能会出现素材被压缩的情况,大屏幕设备可能出现留白)。 |
| setAdShakeDisable(boolean adShakeDisable) | 设置摇一摇禁用,目前优量汇、快手、天目、极光Ads渠道支持,其他渠道需要提交工单或渠道后台控制关闭。参数说明:adShakeDisable(true:禁用、false:可用,默认:false)。|
**ADJgAdSize**
cn.jiguang.jgssp.ad.entity.ADJgAdSize
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgAdSize(int width, int height) | 构造方法。参数说明:
width(容器宽度,单位:px)请传入实际宽度、
height(容器高度,单位:px)请传入实际高度。|
**ADJgSplashAdListener**
cn.jiguang.jgssp.ad.listener.ADJgSplashAdListener
| 方法名 | 介绍 |
| ------------ | ---- |
| onADTick(long millisUntilFinished) | 广告倒计时剩余时长回调。参数说明:millisUntilFinished(剩余时间,单位:秒))。|
| onAdReceive(ADJgAdInfo adInfo) | 广告加载成功回调。|
| onAdExpose(ADJgAdInfo adInfo) | 广告展示回调。|
| onAdClick(ADJgAdInfo adInfo) | 广告点击回调。|
| onAdSkip(ADJgAdInfo adInfo) | 广告跳过回调,用户点击跳过按钮时触发。|
| onAdClose(ADJgAdInfo adInfo) | 广告关闭回调,用户点击跳过按钮、触发落地页后返回开屏页、倒计时结束,则触发。|
| onReward(ADJgAdInfo adInfo) | 广告奖励回调,目前仅优量汇渠道有效。|
| onAdFailed(ADJgError error) | 广告失败回调。参数说明:error(广告错误信息)。|
**ADJgAdInfo**
cn.jiguang.jgssp.ad.data.ADJgAdInfo
| 方法名 | 介绍 |
| ------------ | ---- |
| getPlatform() | 获取三方广告平台名称,返回String类型。|
| getECPM() | 获取ECPM,返回Double类型(单位:元)。|
| getEcpmPrecision() | ECPM类型,返回String类型(accurate:精准、platform_assignment:平台指定、estimate:估算)。|
#### 6.2.2 开屏广告加载并展示
```java
// 创建开屏广告实例,第一个参数可以是Activity或Fragment,第二个参数是广告容器
ADJgSplashAd splashAd = new ADJgSplashAd(Activity activity, ViewGroup container);
// 创建额外参数实例
ADJgExtraParams extraParams = new ADJgExtraParams.Builder()
.adSize(new ADJgAdSize(int width, int height))
.build();
// 如果开屏容器不是全屏可以设置额外参数
splashAd.setLocalExtraParams(extraParams);
// 设置开屏广告监听
splashAd.setListener(new ADJgSplashAdListener() {
@Override
public void onADTick(long countdownSeconds) {
// 如果没有设置自定义跳过按钮不会回调该方法(单位为秒)
}
@Override
public void onReward(ADJgAdInfo adInfo) {
// 目前仅优量汇渠道支持该回调
}
@Override
public void onAdSkip(ADJgAdInfo adInfo) {
// 广告跳过回调,不一定准确,埋点数据仅供参考
}
@Override
public void onAdReceive(ADJgAdInfo adInfo) {
// 广告获取成功回调
}
@Override
public void onAdExpose(ADJgAdInfo adInfo) {
// 广告展示回调,有展示回调不一定是有效曝光,如网络等情况导致上报失败
}
@Override
public void onAdClick(ADJgAdInfo adInfo) {
// 广告点击回调,有点击回调不一定是有效点击,如网络等情况导致上报失败
}
@Override
public void onAdClose(ADJgAdInfo adInfo) {
// 广告关闭回调,需要在此进行页面跳转
}
@Override
public void onAdFailed(ADJgError error) {
// 广告关闭回调,需要在此进行页面跳转
}
});
// 加载并展示开屏广告
splashAd.loadAd(String posId);
```
> [开屏广告示例详情](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/app/src/main/java/com/jiguangssp/addemo/activity/SplashAdActivity.java)
>
#### 6.2.3 开屏广告加载与展示分离
##### 仅加载开屏广告
```java
// 创建广告对象的逻辑与6.2.2的案例相同,不同点在loadAd
...
// 仅加载开屏广告
splashAd.loadOnly(String posId);
```
##### 展示开屏广告
```java
// 需要开发者在onAdReceive回调之后再展示开屏广告
...
public void onAdReceive(ADJgAdInfo adInfo) {
// 广告获取成功回调...
// 展示开屏广告
splashAd.showSplash();
}
...
```
> 开屏广告加载与展示分离示例 [Gitee地址](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/app/src/main/java/com/jiguangssp/addemo/activity/SplashAdLoadShowSeparationActivity.java)
>
### 6.3 Banner横幅广告示例
Banner横幅广告建议放置在 **固定位置**,而非ListView、RecyclerView、ViewPager等控件中充当Item,Banner广告支持多种尺寸比例,可在后台创建广告位时配置,Banner广告的宽度将会撑满容器,高度自适应,建议Banner广告容器高度也为自适应。
#### 6.3.1 横幅广告主要 API
**ADJgBannerAd**
cn.jiguang.jgssp.ad.ADJgBannerAd
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgBannerAd(Activity activity, ViewGroup container) | 构造方法。参数说明:activity(当前页面activity对象)、container(展示广告视图的父容器)。|
| ADJgBannerAd(Fragment fragment, ViewGroup container) | 构造方法。参数说明:fragment(当前页面fragment对象)、container(展示广告视图的父容器)。|
| setAutoRefreshInterval(long seconds) | 设置自刷新时间间隔。参数说明:seconds(0为不自动刷新(部分平台无效,如百度),其他取值范围为[30,120],单位秒)。|
| setOnlySupportPlatform(String platform) | 设置广告定向,仅请求某一渠道。参数说明:platform(渠道名)。注:仅debug模式为true时生效。|
| setListener(ADJgBannerAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。|
| setSceneId(String sceneId) | 设置广告场景id,用于区分同一个广告位在不同场景下使用的数据。参数说明:sceneId(场景ID)。|
| loadAd(String posId) | 请求广告并展示。参数说明:posId(广告位ID)。|
| release() | 释放广告。|
**ADJgBannerAdListener**
cn.jiguang.jgssp.ad.listener.ADJgBannerAdListener
| 方法名 | 介绍 |
| ------------ | ---- |
| onAdReceive(ADJgAdInfo adInfo) | 广告加载成功回调。|
| onAdExpose(ADJgAdInfo adInfo) | 广告展示回调。|
| onAdClick(ADJgAdInfo adInfo) | 广告点击回调。|
| onAdClose(ADJgAdInfo adInfo) | 广告关闭回调,开发者需要在此回调中对广告父视图进行隐藏或移除子视图,并对广告对象进行释放,避免自刷新逻辑持续进行|
| onAdFailed(ADJgError error) | 广告失败回调。参数说明:error(广告错误信息)。|
**ADJgAdInfo**
cn.jiguang.jgssp.ad.data.ADJgAdInfo
| 方法名 | 介绍 |
| ------------ | ---- |
| getPlatform() | 获取三方广告平台名称,返回String类型。|
| getECPM() | 获取ECPM,返回Double类型(单位:元)。|
| getEcpmPrecision() | ECPM类型,返回String类型(accurate:精准、platform_assignment:平台指定、estimate:估算)。|
#### 6.3.2 横幅广告加载并展示
```java
// 创建Banner广告实例,第一个参数可以是Activity或Fragment,第二个参数是广告容器(请保证容器不会拦截点击、触摸等事件)
ADJgBannerAd bannerAd = new ADJgBannerAd(Activity activity, ViewGroup container);
// 设置Banner广告监听
bannerAd.setListener(new ADJgBannerAdListener() {
@Override
public void onAdReceive(ADJgAdInfo adInfo) {
// 广告获取成功回调
}
@Override
public void onAdExpose(ADJgAdInfo adInfo) {
// 广告展示回调,有展示回调不一定是有效曝光,如网络等情况导致上报失败
}
@Override
public void onAdClick(ADJgAdInfo adInfo) {
// 广告点击回调,有点击回调不一定是有效点击,如网络等情况导致上报失败
}
@Override
public void onAdClose(ADJgAdInfo adInfo) {
// 广告关闭回调,开发者需要在此回调中对广告父视图进行隐藏或移除子视图,
// 并对广告对象进行释放,避免自刷新逻辑持续进行
}
@Override
public void onAdFailed(ADJgError error) {
// 广告获取失败回调
}
});
// 加载Banner广告,参数为广告位ID,同一个ADJgBannerAd只有一次loadAd有效
bannerAd.loadAd(String posId);
```
>[Banner广告示例详情](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/app/src/main/java/com/jiguangssp/addemo/activity/BannerAdActivity.java)
### 6.4 信息流广告示例
信息流广告,具备自渲染和模板两种广告样式:自渲染是SDK将返回广告标题、描述、Icon、图片、多媒体视图等信息,开发者可通过自行拼装渲染成喜欢的样式;模板样式则是返回拼装好的广告视图,开发者只需将视图添加到相应容器即可,模板样式的容器高度建议是自适应。
**请务必确保自渲染类型广告渲染时包含广告创意素材(至少包含一张图片)、平台logo、广告标识、关闭按钮;模板广告不得被遮挡。**
**注意,信息流广告点击关闭时,开发者需要在onAdClose回调中将广告容器隐藏或移除,避免如头条渠道点击关闭后视图依旧存在问题**
#### 6.4.1 信息流广告主要 API
**ADJgNativeAd**
cn.jiguang.jgssp.ad.ADJgNativeAd
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgNativeAd(Activity activity) | 构造方法。参数说明:activity(当前页面activity对象)。|
| ADJgNativeAd(Fragment fragment) | 构造方法。参数说明:fragment(当前页面fragment对象)。|
| setLocalExtraParams(ADJgExtraParams extraParams) | 设置额外参数。参数说明:extraParams(广告额外参数)。|
| setOnlySupportPlatform(String platform) | 设置广告定向,仅请求某一渠道。参数说明:platform(渠道名)。注:仅debug模式为true时生效。|
| setListener(ADJgNativeAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。|
| setVideoListener(ADJgNativeVideoListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。|
| setSceneId(String sceneId) | 设置广告场景id,用于区分同一个广告位在不同场景下使用的数据。参数说明:sceneId(场景ID)。|
| loadAd(String posId) | 请求广告并展示。参数说明:posId(广告位ID)。|
| loadAd(String posId, int count) | 请求广告并展示。参数说明:posId(广告位ID)、count(广告数量,1~3条)。|
| release() | 释放广告。|
**ADJgExtraParams**
cn.jiguang.jgssp.ad.entity.ADJgExtraParams
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgExtraParams.Builder().build() | 构造方法。|
| adSize(ADJgAdSize adSize) | 设置整个广告视图预期宽高。参数说明:adSize(广告容器宽高,建议传入宽度为容器实际宽度,高度传入0(自适应高度))。|
| nativeStyle(ADJgAdNativeStyle adNativeStyle) | 设置模板广告内外边距参数。参数说明:adNativeStyle(模板广告样式,目前仅天目平台需要)。|
| nativeAdPlayWithMute(boolean isMute) | 视频静音设置。参数说明:isMute(true:静音、false:不静音,默认:true)。|
**ADJgAdNativeStyle**
cn.jiguang.jgssp.ad.entity.ADJgAdNativeStyle
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgAdNativeStyle(int padding) | 构造方法。参数说明:padding(容器内边距)。|
| ADJgAdNativeStyle(int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) | 构造方法。参数说明:paddingLeft(容器左边距)、paddingTop(容器上边距)、paddingRight(容器右边距)、paddingBottom(容器下边距)。|
| setTitleSize(int titleSize) | 设置标题大小。参数说明:titleSize(标题大小,单位:sp)。|
| setDescSize(int descSize) | 副标题大小。参数说明:descSize(副标题大小,单位:sp)。|
**ADJgNativeAdListener**
cn.jiguang.jgssp.ad.listener.ADJgNativeAdListener
| 方法名 | 介绍 |
| ------------ | ---- |
| onAdReceive(List\ adInfos) | 广告加载成功回调。|
| onAdExpose(ADJgNativeAdInfo adInfo) | 广告展示回调。|
| onAdClick(ADJgNativeAdInfo adInfo) | 广告点击回调。|
| onAdClose(ADJgNativeAdInfo adInfo) | 广告关闭回调,在此回调中移除页面中的视图。|
| onAdFailed(ADJgError error) | 广告失败回调。参数说明:error(广告错误信息)。|
| onRenderFailed(ADJgNativeAdInfo adInfo, ADJgError error) | 广告失败回调。参数说明:error(广告错误信息)。|
| onRenderSuccess(ADJgNativeAdInfo adInfo) | 广告渲染成功回调。|
**ADJgNativeVideoListener**
cn.jiguang.jgssp.ad.listener.ADJgNativeVideoListener
| 方法名 | 介绍 |
| ------------ | ---- |
| onVideoLoad(ADJgNativeAdInfo nativeAdInfo) | 视频加载中回调。|
| onVideoStart(ADJgNativeAdInfo nativeAdInfo) | 视频播放回调。|
| onVideoPause(ADJgNativeAdInfo nativeAdInfo) | 视频暂停回调。|
| onVideoComplete(ADJgNativeAdInfo nativeAdInfo) | 视频播放完毕回调。|
| onVideoError(ADJgNativeAdInfo nativeAdInfo) | 视频异常回调。|
**信息流广告父对象ADJgNativeAdInfo**
信息流模板和自渲染均继承自该类
cn.jiguang.jgssp.ad.data.ADJgNativeAdInfo
| 方法名 | 介绍 |
| ------------ | ---- |
| isNativeExpress() | 广告类型,返回boolean类型,true模板类型,false自渲染类型。|
当isNativeExpress返回true时,可强转为ADJgNativeExpressAdInfo类,否则转为ADJgNativeFeedAdInfo类
**模板广告对象ADJgNativeExpressAdInfo继承自ADJgNativeAdInfo**
cn.jiguang.jgssp.ad.data.ADJgNativeExpressAdInfo
| 方法名 | 类型 | 介绍 |
| ------------ | ---- | ---- |
| getNativeExpressAdView() | View | 获取的是整个模板广告视图。|
| render(ViewGroup container) | void | 渲染视图,调用该方法才能响应曝光、点击等操作,影响广告收益。参数说明:container(承载广告的容器,不能为空)|
**自渲染广告对象ADJgNativeFeedAdInfo继承自ADJgNativeAdInfo**
cn.jiguang.jgssp.ad.data.ADJgNativeFeedAdInfo
| 方法名 | 类型 | 介绍 |
| ------------ | ---- | ---- |
| getTitle() | String | 获取广告标题,可能为空。|
| getDesc() | String | 获取广告描述,可能为空。|
| getActionType() | int | 获取广告交互类型,未知:-1,应用内打开落地页:0,浏览器打开落地页:1,下载类型:2,拨打电话:3。|
| getCtaText() | String | 广告交互按钮文案,可能为空。|
| getIconUrl() | String | 广告图标地址,可能为空。|
| getImageUrl() | String | 图片地址,可能为空。。|
| getImageUrlList() | List | 广告图片集合,可能为空。|
| hasMediaView() | boolean | 判断是否包含多媒体广告视图。|
| getMediaView() | View | 获取的是多媒体广告视图。|
| getPlatformIcon() | int | 获取广告平台角标,资源文件地址。|
| registerViewForInteraction(ViewGroup container, View... actionViews) | void | 注册广告视图。参数说明:container(广告容器)、
actionViews(可点击的布局)|
| registerCloseView(View close) | void | 注册关闭按钮。参数说明:close(点击关闭的view,不注册将不会回调onAdClose事件)|
| getAppInfo() | ADJgAdAppInfo | 下载类应用六要素信息,可能为空。 |
**自渲染广告ADJgAdAppInfo六要素,需要先通过(nativeFeedAdInfo instanceof ADJgAdAppInfo)方法判断广告对象是否支持六要素返回,
然后通过强转获取六要素对象((ADJgAdAppInfo) nativeFeedAdInfo).getAppInfo()**
cn.jiguang.jgssp.ad.data.ADJgAdAppInfo
| 方法名 | 类型 | 介绍 |
| ------------ | ---- | ---- |
| getName() | String | 应用名,可能为空。|
| getDeveloper() | String | 开发者,可能为空。|
| getVersion() | String |版本号,可能为空。|
| getPrivacyUrl() | String | 隐私地址,可能为空。|
| getPermissionsUrl() | String | 权限地址,可能为空。|
| getDescriptionUrl() | String | 功能介绍,可能为空。|
| getSize() | long | 应用大小,可能为空。|
| getIcp() | String | icp备案号,可能为空。|
#### 6.4.2 信息流广告加载并展示
#### 6.4.2.1 信息流广告加载
```java
// 创建信息流广告实例
ADJgNativeAd nativeAd = new ADJgNativeAd(Activity activity);
int widthPixels = getResources().getDisplayMetrics().widthPixels;
// 创建额外参数实例
ADJgExtraParams extraParams = new ADJgExtraParams.Builder()
// 设置整个广告视图预期宽高(目前仅头条、极光、天目平台需要,没有接入可不设置),单位为px,高度如果小于等于0则高度自适应
.adSize(new ADJgAdSize(widthPixels, 0))
.build();
// 设置一些额外参数,有些平台的广告可能需要传入一些额外参数,如果有接入头条平台,该参数必须设置
nativeAd.setLocalExtraParams(extraParams);
// 设置广告监听
nativeAd.setListener(new ADJgNativeAdListener() {
@Override
public void onRenderFailed(ADJgNativeAdInfo adInfo, ADJgError error) {
// 广告渲染失败,可在此回调中移除视图和释放广告对象
}
@Override
public void onRenderSuccess(ADJgNativeAdInfo adJgNativeAdInfo) {
// 广告渲染成功回调
}
@Override
public void onAdReceive(List adInfos) {
// 广告获取成功回调
}
@Override
public void onAdExpose(ADJgNativeAdInfo adInfo) {
// 广告展示回调,有展示回调不一定是有效曝光,如网络等情况导致上报失败
}
@Override
public void onAdClick(ADJgNativeAdInfo adInfo) {
// 广告点击回调,有点击回调不一定是有效点击,如网络等情况导致上报失败
}
@Override
public void onAdClose(ADJgNativeAdInfo adInfo) {
// 广告关闭回调,可在此回调中移除视图和释放广告对象
}
@Override
public void onAdFailed(ADJgError error) {
// 广告获取失败回调
}
});
// 请求广告数据,参数一广告位ID,参数二请求数量[1,3]
nativeAd.loadAd(String posId, int count);
```
#### 6.4.2.2 信息流广告展示-模板
```java
// 判断广告Info对象是否被释放(调用过ADJgNativeAd的release()或ADJgNativeAdInfo的release()会释放广告Info对象)
// 释放后的广告Info对象不能再次使用
if (!ADJgAdUtil.adInfoIsRelease(nativeExpressAdInfo)) {
// 当前是信息流模板广告,getNativeExpressAdView获取的是整个模板广告视图
View nativeExpressAdView = nativeExpressAdInfo.getNativeExpressAdView((ViewGroup) itemView);
// 将广告视图添加到容器中的便捷方法
ADJgViewUtil.addAdViewToAdContainer((ViewGroup) itemView, nativeExpressAdView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
// 渲染广告视图, 必须调用, 因为是模板广告, 所以传入ViewGroup和响应点击的控件可能并没有用
// 务必在最后调用
nativeExpressAdInfo.render((ViewGroup) itemView);
}
```
#### 6.4.2.3 信息流广告展示-自渲染
```java
// 判断广告Info对象是否被释放(调用过ADJgNativeAd的release()或ADJgNativeAdInfo的release()会释放广告Info对象)
// 释放后的广告Info对象不能再次使用
if (!ADJgAdUtil.adInfoIsRelease(nativeFeedAdInfo)) {
NativeAdAdapter.setVideoListener(nativeFeedAdInfo);
// 交由子类实现加载图片还是MediaView
setImageOrMediaData(context, nativeFeedAdInfo);
Glide.with(context).load(nativeFeedAdInfo.getIconUrl()).into(ivIcon);
ivAdTarget.setImageResource(nativeFeedAdInfo.getPlatformIcon());
tvTitle.setText(nativeFeedAdInfo.getTitle());
tvDesc.setText(nativeFeedAdInfo.getDesc());
tvAdType.setText(nativeFeedAdInfo.getCtaText());
// 注册广告交互, 必须调用
// 注意:部分渠道只会响应View...actionViews的点击事件,如快手的视频组件,不传则无法点击
nativeFeedAdInfo.registerViewForInteraction(rlAdContainer, rlAdContainer, tvAdType);
// 注册关闭按钮,将关闭按钮点击事件交于SDK托管,以便于回调onAdClose
// 务必最后调用
nativeFeedAdInfo.registerCloseView(ivClose);
}
```
> [信息流自渲染广告示例详情](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/app/src/main/java/com/jiguangssp/addemo/activity/NativeAdActivity.java)
> [信息流模板广告示例详情](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/app/src/main/java/com/jiguangssp/addemo/activity/NativeExpressAdActivity.java)
### 6.5 激励视频广告示例
将短视频融入到APP场景当中,用户观看短视频广告后可以给予一些应用内奖励。
#### 6.5.1 激励视频广告主要 API
**ADJgRewardVodAd**
cn.jiguang.jgssp.ad.ADJgRewardVodAd
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgRewardVodAd(Activity activity) | 构造方法。参数说明:activity(当前页面activity对象)。|
| ADJgRewardVodAd(Fragment fragment) | 构造方法。参数说明:fragment(当前页面fragment对象)。|
| setLocalExtraParams(ADJgExtraParams extraParams) | 设置额外参数。参数说明:extraParams(广告额外参数)。|
| setOnlySupportPlatform(String platform) | 设置广告定向,仅请求某一渠道。参数说明:platform(渠道名)。注:仅debug模式为true时生效。|
| setListener(ADJgRewardVodAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。|
| setSceneId(String sceneId) | 设置广告场景id,用于区分同一个广告位在不同场景下使用的数据。参数说明:sceneId(场景ID)。|
| loadAd(String posId) | 请求广告并展示。参数说明:posId(广告位ID)。|
| release() | 释放广告。|
**ADJgExtraParams**
cn.jiguang.jgssp.ad.entity.ADJgExtraParams
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgExtraParams.Builder().build() | 构造方法。|
| rewardExtra(ADJgRewardExtra extra) | 设置服务端奖励验证额外参数。参数说明:extra(服务端奖励验证额外参数请参考:[Gitee地址](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/Android-ADJgSDK激励视频服务端验证使用说明.md)
| setVideoWithMute(boolean isMute) | 视频静音设置。参数说明:isMute(true:静音、false:不静音,默认:true)。|
**ADJgRewardVodAdListener**
cn.jiguang.jgssp.ad.listener.ADJgRewardVodAdListener
| 方法名 | 介绍 |
| ------------ | ---- |
| onAdReceive(ADJgRewardVodAdInfo adInfo) | 广告加载成功回调。|
| onAdExpose(ADJgRewardVodAdInfo adInfo) | 广告曝光回调。|
| onAdClick(ADJgRewardVodAdInfo adInfo) | 广告点击回调。|
| onAdClose(ADJgRewardVodAdInfo adInfo) | 广告关闭回调。|
| onReward(ADJgRewardVodAdInfo adInfo) | 广告奖励回调。|
| onVideoCache(ADJgRewardVodAdInfo adInfo) | 广告缓存成功回调。|
| onVideoComplete(ADJgRewardVodAdInfo adInfo) | 广告播放完毕回调。|
| onVideoError(ADJgRewardVodAdInfo adInfo, ADJgError error) | 视频播放错误回调。|
| onAdFailed(ADJgError error) | 广告获取失败回调。|
**ADJgRewardVodAdInfo**
cn.jiguang.jgssp.ad.data.ADJgRewardVodAdInfo
| 方法名 | 介绍 |
| ------------ | ---- |
| showRewardVod(Activity activity) | 展示广告。参数说明:activity(当前页面activity对象)。|
| getPlatform() | 获取三方广告平台名称,返回String类型。|
| getECPM() | 获取ECPM,返回Double类型(单位:元)。|
| getEcpmPrecision() | ECPM类型,返回String类型(accurate:精准、platform_assignment:平台指定、estimate:估算)。|
#### 6.5.2 激励视频广告加载并展示
```java
// 创建激励视频广告实例
ADJgRewardVodAd rewardVodAd = new ADJgRewardVodAd(Activity activity);
// 设置激励视频广告监听
rewardVodAd.setListener(new ADJgRewardVodAdListener() {
@Override
public void onAdReceive(ADJgRewardVodAdInfo adInfo) {
// 广告获取成功回调
// 全屏视频广告对象一次成功拉取的广告数据只允许展示一次
// 广告展示
adInfo.showRewardVod(Activity activity)
}
@Override
public void onVideoCache(ADJgRewardVodAdInfo adInfo) {
// 广告视频缓存成功回调
// 部分渠道存在激励展示类广告,不会回调该方法,建议在onAdReceive做广告展示处理
}
@Override
public void onVideoComplete(ADJgRewardVodAdInfo adInfo) {
// 广告观看完成回调
}
@Override
public void onVideoError(ADJgRewardVodAdInfo adInfo, ADJgError error) {
// 广告播放错误回调
}
@Override
public void onReward(ADJgRewardVodAdInfo adInfo) {
// 广告激励发放回调
}
@Override
public void onAdExpose(ADJgRewardVodAdInfo adInfo) {
// 广告展示回调,有展示回调不一定是有效曝光,如网络等情况导致上报失败
}
@Override
public void onAdClick(ADJgRewardVodAdInfo adInfo) {
// 广告点击回调,有点击回调不一定是有效点击,如网络等情况导致上报失败
}
@Override
public void onAdClose(ADJgRewardVodAdInfo adInfo) {
// 广告关闭回调
}
@Override
public void onAdFailed(ADJgError error) {
// 广告获取失败回调
}
});
// 加载激励视频广告,参数为广告位ID
rewardVodAd.loadAd(String posId);
```
> [激励视频广告示例详情](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/app/src/main/java/com/jiguangssp/addemo/activity/RewardVodAdActivity.java)
> [Android-ADJgSDK 激励视频服务端验证使用说明](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/Android-ADJgSDK激励视频服务端验证使用说明.md)
### 6.6 插屏广告示例
插屏广告是移动广告的一种常见形式,在应用流程中弹出,当应用展示插屏广告时,用户可以选择点击广告,也可以将其关闭并返回应用。
#### 6.6.1 插屏广告主要 API
**ADJgInterstitialAd**
cn.jiguang.jgssp.ad.ADJgInterstitialAd
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgInterstitialAd(Activity activity) | 构造方法。参数说明:activity(当前页面activity对象)。|
| ADJgInterstitialAd(Fragment fragment) | 构造方法。参数说明:fragment(当前页面fragment对象)。|
| setLocalExtraParams(ADJgExtraParams extraParams) | 设置额外参数。参数说明:extraParams(广告额外参数)。|
| setOnlySupportPlatform(String platform) | 设置广告定向,仅请求某一渠道。参数说明:platform(渠道名)。注:仅debug模式为true时生效。|
| setListener(ADJgInterstitialAdListener listener) | 设置广告相关状态。参数说明:listener(广告状态监听器)。|
| setSceneId(String sceneId) | 设置广告场景id,用于区分同一个广告位在不同场景下使用的数据。参数说明:sceneId(场景ID)。|
| loadAd(String posId) | 请求广告并展示。参数说明:posId(广告位ID)。|
| release() | 释放广告。|
**ADJgExtraParams**
cn.jiguang.jgssp.ad.entity.ADJgExtraParams
| 方法名 | 介绍 |
| ------------ | ---- |
| ADJgExtraParams.Builder().build() | 构造方法。|
| setVideoWithMute(boolean isMute) | 视频静音设置。参数说明:isMute(true:静音、false:不静音,默认:true)。|
**ADJgInterstitialAdListener**
cn.jiguang.jgssp.ad.listener.ADJgInterstitialAdListener
| 方法名 | 介绍 |
| ------------ | ---- |
| onAdReceive(ADJgInterstitialAdInfo adInfo) | 广告加载成功回调。|
| onAdExpose(ADJgInterstitialAdInfo adInfo) | 广告曝光回调。|
| onAdClick(ADJgInterstitialAdInfo adInfo) | 广告点击回调。|
| onAdClose(ADJgInterstitialAdInfo adInfo) | 广告关闭回调。|
| onAdReady(ADJgInterstitialAdInfo adInfo) | 广告准备完毕回调。|
| onAdFailed(ADJgError error) | 广告获取失败回调。|
**ADJgInterstitialAdInfo**
cn.jiguang.jgssp.ad.data.ADJgInterstitialAdInfo
| 方法名 | 介绍 |
| ------------ | ---- |
| showInterstitial(Activity activity) | 展示广告。参数说明:activity(当前页面activity对象)。|
| getPlatform() | 获取三方广告平台名称,返回String类型。|
| getECPM() | 获取ECPM,返回Double类型(单位:元)。|
| getEcpmPrecision() | ECPM类型,返回String类型(accurate:精准、platform_assignment:平台指定、estimate:估算)。|
#### 6.6.2 插屏广告加载并展示
```java
ADJgInterstitialAd interstitialAd = new ADJgInterstitialAd(Activity activity);
// 设置插屏广告监听
interstitialAd.setListener(new ADJgInterstitialAdListener() {
@Override
public void onAdReceive(ADJgInterstitialAdInfo adInfo) {
// 广告获取成功回调
// 插屏广告对象一次成功拉取的广告数据只允许展示一次
// 展示广告
adInfo.showInterstitial(Activity activity);
}
@Override
public void onAdReady(ADJgInterstitialAdInfo adInfo) {
// 广告准备完毕回调
}
@Override
public void onAdExpose(ADJgInterstitialAdInfo adInfo) {
// 广告展示回调,有展示回调不一定是有效曝光,如网络等情况导致上报失败
}
@Override
public void onAdClick(ADJgInterstitialAdInfo adInfo) {
// 广告点击回调,有点击回调不一定是有效点击,如网络等情况导致上报失败
}
@Override
public void onAdClose(ADJgInterstitialAdInfo adInfo) {
// 广告点击关闭回调
}
@Override
public void onAdFailed(ADJgError error) {
// 广告获取失败回调
}
});
// 加载插屏广告
interstitialAd.loadAd(String posId);
```
注意广告对象的获取是异步的,请在onAdReceive或onAdReady回调后展示广告
> [插屏广告示例详情](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/app/src/main/java/com/jiguangssp/addemo/activity/InterstitialAdActivity.java)
>
### 6.10 备注
具体的接入代码和流程,请参考Demo
## 7. 常见问题和错误调试
> [常见问题和错误调试及错误码](https://gitee.com/jiguang-official/adjg-sdk-android/blob/master/AdapterErrorCode)