Este guia descreve a implementação para o envio de dados de receitas ao nível da impressão (ILRD) do TopOn para o Tenjin. A integração funciona através da deteção de um callback específico do SDK do TopOn, onAdRevenuePaid(ATAdInfo adInfo), que é acionado sempre que uma impressão publicitária gera receitas. Este objeto ATAdInfo, que contém dados detalhados sobre as receitas, é então transmitido ao SDK da Tenjin.
Este guia fornece instruções sobre como enviar dados de receitas por nível de exibição de anúncios (ILRD) do TopOn para o Tenjin. Esta integração funciona através da monitorização de um callback específico do SDK do TopOn, o onAdRevenuePaid(ATAdInfo adInfo) do SDK do TopOn, que é acionado sempre que uma exibição de anúncio gera receitas. Este objeto ATAdInfo, que contém dados detalhados sobre as receitas, é posteriormente transmitido ao SDK do Tenjin.
Passo 1: Verificar as dependências do projeto Passo 1: Verificar as dependências do projeto #
No ficheiro build.gradle do seu módulo de aplicação, certifique-se de que incluiu as dependências necessárias. No ficheiro build.gradle do seu módulo de aplicação, certifique-se de que incluiu as dependências necessárias.
- Última versão do TopOn SDK A versão mais recente do TopOn SDK
- Adaptadores de redes publicitárias: Deve incluir os adaptadores para todas as redes publicitárias que pretenda mediar através do TopOn (por exemplo, AdMob, AppLovin, Unity Ads, Meta, etc.). Adaptadores de plataformas de publicidade: Deve incluir o adaptador correspondente a cada plataforma de publicidade que pretenda agregar através do TopOn (por exemplo: AdMob, AppLovin, Unity Ads, Meta, etc.).
// 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
}Passo 2: Inicializar os SDKs 初始化 SDK #
No método onCreate da sua Activity principal, inicialize os SDKs do Tenjin e do TopOn.
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();
}
// ...
}Passo 3: Implementar o acompanhamento das receitas para CADA formato de anúncio Implementar o acompanhamento das receitas para cada formato de anúncio #
You must implement the revenue listener for every Ad Format you use. If tracking is missing for even one format (e.g., Rewarded Video), all impressions from it will be missed by Tenjin. The correct method is to set an ATAdRevenueListener and call Tenjin’s eventAdImpressionTopOn() method from inside the onAdRevenuePaid() callback.
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. Anúncios intersticiais (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. Anúncios em vídeo com recompensa (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. Anúncios nativos e anúncios de ecrã inicial (Native e Splash) #
Deve seguir exatamente o mesmo padrão para quaisquer outros formatos de anúncio que utilize, tais como Anúncios Nativos (ATNativeAd) e Anúncios Splash (ATSplashAd). Cada objeto de anúncio necessita do seu próprio ATAdRevenueListener. Para qualquer outro formato de anúncio que utilize, como os anúncios nativos (ATNativeAd) e os anúncios splash (ATSplashAd), deve seguir exatamente o mesmo padrão. Cada objeto de anúncio necessita do seu próprio ATAdRevenueListener.
Passo 4: Resolver conflitos de delegados do SDK 解决 SDK 代理冲突 #
Se utilizar outro serviço (como o Firebase, o GameAnalytics, etc.) que também monitorize as receitas publicitárias do TopOn, poderá ocorrer um conflito. Só é possível definir um único ouvinte. Se utilizar outros serviços que também necessitem de monitorizar as receitas publicitárias do TopOn (por exemplo, Firebase, GameAnalytics, etc.), poderá ocorrer um conflito. Só é possível definir um único ouvinte por evento.
- Sintoma: As impressões aparecem corretamente num serviço, mas não aparecem no Tenjin. Sintoma: Os dados de exibição de anúncios aparecem corretamente num serviço, mas não aparecem no Tenjin.
- Solução: Não defina vários ouvintes. Em vez disso, identifique onde o seu outro serviço recebe o objeto ATAdInfo a partir do callback onAdRevenuePaid. Nesse mesmo local, adicione a chamada ao Tenjin para garantir que ambos os serviços recebam os dados. Solução: Não defina vários ouvintes. Em vez disso, identifique onde o seu outro serviço recebe o objeto ATAdInfo da chamada de retorno onAdRevenuePaid. Nesse mesmo local, adicione a chamada ao Tenjin para garantir que ambos os serviços recebam os dados.
// 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);
}
}