Hướng dẫn này cung cấp cách thức triển khai việc gửi Dữ liệu Doanh thu theo Lượt hiển thị (ILRD) từ TopOn sang Tenjin. Quá trình tích hợp này hoạt động bằng cách theo dõi một hàm gọi lại cụ thể từ SDK TopOn, onAdRevenuePaid(ATAdInfo adInfo), được kích hoạt mỗi khi một lượt hiển thị quảng cáo tạo ra doanh thu. Đối tượng ATAdInfo này, chứa dữ liệu doanh thu chi tiết, sau đó được truyền đến SDK của Tenjin.
Hướng dẫn này cung cấp phương pháp triển khai việc truyền dữ liệu doanh thu theo cấp độ hiển thị quảng cáo (ILRD) từ TopOn sang Tenjin. Tích hợp này hoạt động bằng cách lắng nghe một hàm gọi lại cụ thể trong SDK của TopOn là `onAdRevenuePaid`(ATAdInfo adInfo) của SDK TopOn; hàm gọi lại này sẽ được kích hoạt mỗi khi một lần hiển thị quảng cáo tạo ra doanh thu. Đối tượng ATAdInfo chứa dữ liệu doanh thu chi tiết sau đó sẽ được truyền đến SDK Tenjin.
Bước 1: Xác minh các phụ thuộc của dự án Bước 1: Xác minh các phụ thuộc của dự án #
Trong tệp build.gradle ở cấp độ ứng dụng, hãy đảm bảo rằng bạn đã thêm các phụ thuộc cần thiết. 在您应用模块的 build.gradle 文件中,请确保已包含必要的依赖项。
- Phiên bản mới nhất của TopOn SDK Phiên bản mới nhất của TopOn SDK
- Bộ điều hợp mạng quảng cáo: Bạn phải thêm các bộ điều hợp cho mọi mạng quảng cáo mà bạn dự định trung gian qua TopOn (ví dụ: AdMob, AppLovin, Unity Ads, Meta, v.v.). Bộ điều hợp mạng quảng cáo: Bạn phải thêm bộ điều hợp tương ứng cho từng mạng quảng cáo mà bạn muốn tổng hợp thông qua TopOn (ví dụ: AdMob, AppLovin, Unity Ads, Meta, v.v.).
// 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
}Bước 2: Khởi tạo SDKs 初始化 SDK #
Trong phương thức onCreate của Activity chính, hãy khởi tạo cả Tenjin và TopOn. 在您的主 Activity 的 onCreate 方法中,初始化 Tenjin 和 TopOn 的 SDK。
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();
}
// ...
}Bước 3: Triển khai theo dõi doanh thu cho MỖI định dạng quảng cáo #
Bạn phải triển khai trình nghe sự kiện doanh thu cho mọi định dạng quảng cáo mà bạn sử dụng. Nếu thiếu theo dõi đối với dù chỉ một định dạng (ví dụ: Video có phần thưởng), tất cả các lần hiển thị từ định dạng đó sẽ không được Tenjin ghi nhận. Cách thực hiện đúng là thiết lập một đối tượng ATAdRevenueListener và gọi phương thức eventAdImpressionTopOn() của Tenjin từ bên trong hàm callback onAdRevenuePaid().
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. Quảng cáo xen kẽ (Interstitial) #
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. Quảng cáo video có phần thưởng (Rewarded Video) #
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. Quảng cáo bản địa (Native) và quảng cáo màn hình chào mừng (Splash) #
Bạn phải tuân thủ cấu trúc chính xác như vậy đối với bất kỳ định dạng quảng cáo nào khác mà bạn sử dụng, chẳng hạn như Quảng cáo bản địa (ATNativeAd) và Quảng cáo màn hình chào mừng (ATSplashAd). Mỗi đối tượng quảng cáo cần có ATAdRevenueListener riêng. Đối với bất kỳ định dạng quảng cáo nào khác mà bạn sử dụng, chẳng hạn như Quảng cáo bản địa (ATNativeAd) và Quảng cáo màn hình chào mừng (ATSplashAd), bạn phải tuân theo mẫu hoàn toàn giống nhau. Mỗi đối tượng quảng cáo cần có ATAdRevenueListener riêng.
Bước 4: Giải quyết xung đột đại diện SDK #
Nếu bạn sử dụng một dịch vụ khác (như Firebase, GameAnalytics, v.v.) cũng theo dõi doanh thu quảng cáo từ TopOn, có thể sẽ xảy ra xung đột. Chỉ có thể thiết lập một trình nghe sự kiện duy nhất. Nếu bạn sử dụng các dịch vụ khác cũng cần theo dõi doanh thu quảng cáo từ TopOn (chẳng hạn như Firebase, GameAnalytics, v.v.), có thể xảy ra xung đột. Mỗi sự kiện chỉ có thể thiết lập một trình nghe sự kiện.
- Triệu chứng: Số lần hiển thị quảng cáo được hiển thị chính xác trên một dịch vụ nhưng lại bị thiếu trên Tenjin. Triệu chứng: Dữ liệu hiển thị quảng cáo được hiển thị bình thường trên một dịch vụ, nhưng lại bị thiếu trên Tenjin.
- Giải pháp: Không nên thiết lập nhiều trình nghe sự kiện. Thay vào đó, hãy xác định vị trí mà dịch vụ khác của bạn nhận đối tượng ATAdInfo từ hàm gọi lại onAdRevenuePaid. Tại chính vị trí đó, hãy thêm lệnh gọi đến Tenjin để đảm bảo cả hai dịch vụ đều nhận được dữ liệu. Giải pháp: Không nên thiết lập nhiều trình nghe. Thay vào đó, hãy xác định vị trí mà dịch vụ khác của bạn nhận được đối tượng ATAdInfo từ hàm gọi lại onAdRevenuePaid. Tại vị trí đó, hãy thêm lệnh gọi đến Tenjin để đảm bảo cả hai dịch vụ đều nhận được dữ liệu.
// 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);
}
}