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 #
Deve implementar o ouvinte de receitas para todos os formatos de anúncio que utilizar. Se faltar o acompanhamento de apenas um formato (por exemplo, Vídeo com Recompensa), todas as impressões desse formato não serão registadas pelo Tenjin. O método correto consiste em definir um ATAdRevenueListener e chamar o método eventAdImpressionTopOn() do Tenjin a partir do 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. 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);
}
}