本指南介绍了如何从 TopOn 向 Tenjin 发送展示级收入数据(ILRD)。该集成通过监看 TopOn SDK 的特定回调函数 onAdRevenuePaid(ATAdInfo adInfo) 来实现,该回调函数会在每次广告展示产生收入时触发。随后,包含详细收入数据的 ATAdInfo 对象会被传递给 Tenjin SDK。
-
Step 1: Verify Project Dependencies 第 1 步:验证项目依赖 #
在您应用模块的 build.gradle 文件中,请确保已包含必要的依赖项。
- Latest TopOn SDK 最新的 TopOn SDK
- - - - -
广告平台 Adapter: 您 必须 为每一个您希望通过 TopOn 进行聚合的广告平台添加其对应的 adapter(例如:AdMob, AppLovin, Unity Ads, Meta 等)。
Java
// Example: app/build.gradle
dependencies {
// 1. TopOn (AnyThink) SDK Core
implementation 'com.anythink.sdk:core:6.4.17'
// 2. Adapters for ALL supported ad networks 所有支持的广告平台的 Adapter
implementation 'com.anythink.sdk:adapter-admob:6.4.17'
implementation 'com.anythink.sdk:adapter-applovin:6.4.17'
implementation 'com.anythink.sdk:adapter-unityads:6.4.17'
implementation 'com.anythink.sdk:adapter-meta:6.4.17'
// ... add every other adapter you use 添加您使用的所有其他 adapter
}Step 2: Initialize SDKs 初始化 SDK #
在您的主 Activity 的 onCreate 方法中,初始化 Tenjin 和 TopOn 的 SDK。
Java
import com.anythink.core.API.ATSDK;
import com.tenjin.android.TenjinSDK;
// ... other imports
public class YourMainActivity extends Activity {
private TenjinSDK tenjinInstance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ... your other setup code
// 1. Initialize Tenjin 初始化 Tenjin
tenjinInstance = TenjinSDK.getInstance(this, "<Your Tenjin API Key>");
// 2. Initialize TopOn 初始化 TopOn
ATSDK.init(getApplicationContext(), "<Your TopOn App ID>", "<Your TopOn App Key>");
// 3. Load your ads 加载您的广告
loadAllAdFormats();
}
// ...
}Step 3: 为每种广告格式实现收益追踪 #
你必须为你使用的所有广告形式(Ad Format)都实现收益监管。如果其中任意一种形式(例如:激励视频)缺失了追踪代码,Tenjin 将会漏掉该形式产生的所有展示记录。正确的做法是:设置一个 ATAdRevenueListener,并在 onAdRevenuePaid() 回调方法内部调用 Tenjin 的 eventAdImpressionTopOn() 方法。
Java
private void loadBannerAd() {
ATBannerView mBannerView = new ATBannerView(this);
mBannerView.setPlacementId("<Your_Banner_Placement_ID>");
// ... add the banner view to your layout ...
// Set the revenue listener 设置收益监听
mBannerView.setAdRevenueListener(new ATAdRevenueListener() {
@Override
public void onAdRevenuePaid(ATAdInfo adInfo) {
// Send revenue data to Tenjin for every impression, including auto-refreshes
// 为每一次广告展示(包括自动刷新)向 Tenjin 发送收益数据
if (tenjinInstance != null) {
tenjinInstance.eventAdImpressionTopOn(adInfo);
}
}
});
mBannerView.loadAd();
}B. Interstitial ads 插屏广告 (Interstitial) #
Java
private void loadInterstitialAd() {
ATInterstitial mInterstitialAd = new ATInterstitial(this, "<Your_Interstitial_Placement_ID>");
// Set the revenue listener
// 设置收益监听器
mInterstitialAd.setAdRevenueListener(new ATAdRevenueListener() {
@Override
public void onAdRevenuePaid(ATAdInfo adInfo) {
// Send revenue data to Tenjin
// 向 Tenjin 发送收益数据
if (tenjinInstance != null) {
tenjinInstance.eventAdImpressionTopOn(adInfo);
}
}
});
mInterstitialAd.load();
}C. Rewarded Video Ads 激励视频广告 (Rewarded Video) #
Java
private void loadRewardedVideoAd() {
ATRewardVideoAd mRewardVideoAd = new ATRewardVideoAd(this, "<Your_Rewarded_Placement_ID>");
// Set the revenue listener
// 设置收益监听器
mRewardVideoAd.setAdRevenueListener(new ATAdRevenueListener() {
@Override
public void onAdRevenuePaid(ATAdInfo adInfo) {
// Send revenue data to Tenjin
// 向 Tenjin 发送收益数据
if (tenjinInstance != null) {
tenjinInstance.eventAdImpressionTopOn(adInfo);
}
}
});
mRewardVideoAd.load();
}D. Native and Splash Ads 原生广告 (Native) 和开屏广告 (Splash) #
对于您使用的任何其他广告格式,例如原生广告(ATNativeAd)和开屏广告(ATSplashAd),您都必须遵循 完全相同的模式。每个广告对象都需要有自己的 ATAdRevenueListener。
Step 4: Resolve SDK Delegate Conflicts 解决 SDK 代理冲突 #
如果您使用其他也需要追踪 TopOn 广告收益的服务(例如 Firebase, GameAnalytics 等),可能会遇到冲突。一个事件只能设置一个监听器。
- 问题: 广告展示数据在某个服务中显示正常,但在 Tenjin 中却有缺失。
- 解决方案: 不要设置多个监听器。相反,找到您的其他服务接收 onAdRevenuePaid 回调中 ATAdInfo 对象的位置。在同一个地方,添加对 Tenjin 的调用,以确保两个服务都能收到数据。
Java
// Example of resolving a listener conflict
// 解决监听器冲突的示例
public void onAdRevenuePaid(ATAdInfo adInfo) {
// 1. Call for your other service
// 1. 为您的其他服务发起调用
callMyOtherAnalyticsService(adInfo);
// 2. [CRITICAL] Add the call to Tenjin in the same place
// 2. [关键] 在同一个地方添加对 Tenjin 的调用
if (tenjinInstance != null) {
tenjinInstance.eventAdImpressionTopOn(adInfo);
}
}