Este guia é destinado a redes de publicidade que querem criar um adaptador de lances para participar dos lances em tempo real (RTB) na mediação do Google. Se você for um editor, consulte as instruções de mediação do editor.
Um adaptador de lances é a parte do cliente da integração. O adaptador permite que o SDK da rede de publicidade se comunique com o SDK dos anúncios para dispositivos móveis do Google para carregar anúncios veiculados pelo bidder.
Para que os lances funcionem corretamente, seu adaptador precisa processar a inicialização, coletar indicadores, carregar anúncios e retransmitir eventos do ciclo de vida do anúncio. Neste guia, vamos mostrar como implementar o adaptador para processar essas operações.
Fluxo de trabalho de um adaptador de lances
Inicialização
Um fluxo detalhado de todo o ciclo de vida de renderização de solicitação-resposta de um adaptador é mostrado abaixo:
O adaptador é responsável pelas seguintes partes do fluxo de trabalho:
Etapas 4 a 7: inicialize o adaptador e chame de volta o SDK dos anúncios para dispositivos móveis do Google quando a inicialização for concluída.
Etapas 10 a 13: colete indicadores do SDK da rede de publicidade para serem enviados ao licitante para participar de uma solicitação de RTB e encaminhe-os ao SDK dos anúncios para dispositivos móveis do Google.
Etapas 18 a 21: se o bidder retornar o lance vencedor, carregue o anúncio de acordo com a resposta do bidder. Depois de carregado, notifique o SDK dos anúncios para dispositivos móveis do Google que o anúncio foi carregado.
Etapa 23 e posteriores: enquanto o anúncio está sendo exibido, notifique o SDK dos anúncios para dispositivos móveis do Google sobre eventos de impressão e clique, bem como os outros eventos que ocorrem durante o ciclo de apresentação do anúncio.
Como implementar o adaptador de lances
Para criar um adaptador de lances para o SDK dos anúncios para dispositivos móveis do Google, é necessário
estender a classe abstrata RtbAdapter
. As seções a seguir
explicam cada método abstrato em RtbAdapter
.
getSDKVersionInfo()
Aqui, você precisa retornar a versão do SDK. Essa versão é transmitida ao bidder como parte da solicitação do OpenRTB.
Esse método exige que você retorne um VersionInfo
. O exemplo abaixo mostra como
converter a versão de string do SDK em um VersionInfo.
.
@Override
public VersionInfo getSDKVersionInfo() {
// Get your SDK's version as a string. E.g. "1.2.3"
// String versionString = YourSdk.getVersion();
String splits[] = versionString.split("\\.");
if (splits.length >= 3) {
int major = Integer.parseInt(splits[0]);
int minor = Integer.parseInt(splits[1]);
int micro = Integer.parseInt(splits[2]);
return new VersionInfo(major, minor, micro);
}
String logMessage = String.format("Unexpected SDK version format: %s." +
"Returning 0.0.0 for SDK version.", sdkVersion);
Log.w(TAG, logMessage);
return new VersionInfo(0, 0, 0);
}
getVersionInfo()
Aqui, você precisa retornar a versão do adaptador. Essa versão é transmitida ao bidder como parte da solicitação do OpenRTB.
Os adaptadores
de código aberto e versionados do Google
usam um esquema de versão de adaptador de quatro dígitos, mas o VersionInfo
permite apenas três
dígitos. Para contornar esse problema, é recomendável combinar os dois últimos dígitos
na versão do patch, conforme mostrado abaixo.
@Override
public VersionInfo getVersionInfo() {
// Get your adapters's version as a string. E.g. "1.2.3.0"
String versionString = BuildConfig.VERSION_NAME;
String splits[] = versionString.split("\\.");
if (splits.length >= 4) {
int major = Integer.parseInt(splits[0]);
int minor = Integer.parseInt(splits[1]);
int micro = Integer.parseInt(splits[2]) * 100 + Integer.parseInt(splits[3]);
return new VersionInfo(major, minor, micro);
}
String logMessage = String.format("Unexpected adapter version format: %s." +
"Returning 0.0.0 for adapter version.", versionString);
Log.w(TAG, logMessage);
return new VersionInfo(0, 0, 0);
}
initialize()
Tempo limite: 30 segundos
O método initialize()
é o primeiro método chamado no adaptador. Ele é
chamado apenas uma vez por sessão. Esse método fornece uma lista de
objetos MediationConfiguration
que representam a lista completa de
posições no app que estão configuradas para sua rede de publicidade. É possível percorrer
essa lista para analisar as credenciais de cada posição
e transmitir dados relevantes para o SDK para inicialização.
Quando o SDK for inicializado e estiver pronto para receber solicitações de anúncio, invoque o
método onInitializationSucceeded()
do InitializationCompleteCallback
.
Esse callback é encaminhado aos editores de apps para que eles saibam que
podem começar a carregar anúncios.
@Override
public void initialize(Context context,
InitializationCompleteCallback initializationCompleteCallback,
List<MediationConfiguration> mediationConfigurations) {
// Initialize your ad network's SDK.
...
// Invoke the InitializationCompleteCallback once initialization completes.
initializationCompleteCallback.onInitializationSucceeded();
}
collectSignals()
Tempo limite: 1 segundo
Sempre que o editor solicita um anúncio, uma nova instância do RtbAdapter
é
criada e o método collectSignals()
é chamado. Essa instância de
RtbAdapter
será usada durante o ciclo de vida de solicitação, resposta e
renderização do anúncio. O método collectSignals()
permite que o
adaptador forneça indicadores do dispositivo para serem enviados ao bidder em uma
solicitação do OpenRTB.
collectSignals()
é chamado em uma linha de execução em segundo plano.
O SDK dos anúncios para dispositivos móveis do Google solicita simultaneamente indicadores de todos os adaptadores
que participam dos lances. Seja respeitoso e limite as chamadas para a linha de execução de IU
durante esse período. Qualquer trabalho pesado que seu adaptador ou SDK precise fazer para coletar
sinais precisa ser feito no método initialize()
e armazenado em cache.
Quando os sinais estiverem prontos, chame o callback onSuccess()
com os
sinais codificados.
Confira um exemplo de implementação:
@Override
public void collectSignals(RtbSignalData rtbSignalData,
SignalCallbacks signalCallbacks) {
String signals = YourSdk.getSignals();
signalCallbacks.onSuccess(signals);
}
Se o adaptador não conseguir coletar sinais, chame signalCallbacks.onFailure()
com uma string explicando o erro que ocorreu.
Implementar métodos de carregamento de anúncios
Tempo limite: 10 segundos
Se o bidder retornar o lance vencedor, o SDK dos anúncios para dispositivos móveis do Google vai chamar o adaptador para carregar o anúncio vencedor, transmitindo todos os dados que o bidder retornou e que o SDK precisa para carregar esse anúncio.
O método de carregamento exato que é chamado depende do formato do anúncio para o qual a solicitação é destinada:
Formato do anúncio | Método de carregamento |
---|---|
Banner | loadBannerAd()
|
Intersticial | loadInterstitialAd()
|
Premiado | loadRewardedAd()
|
Implemente esses métodos para os formatos de anúncio compatíveis com o adaptador.
O método de carregamento é chamado na linha de execução da interface, na mesma instância do adaptador de onde você forneceu sinais. Esse método fornece os seguintes parâmetros:
Um
MediationAdConfiguration
, que contém parâmetros necessários para que o SDK carregue o anúncio do lance vencedor, como a resposta ao lance e todas as credenciais que o editor configurou na interface da AdMob.Um objeto
MediationAdLoadCallback
usado para notificar o SDK dos anúncios para dispositivos móveis do Google quando o carregamento é bem-sucedido ou falha.
Depois que o SDK carregar o anúncio, chame mediationAdLoadCallback.onSuccess()
. Se o carregamento do anúncio falhar, chame mediationAdLoadCallback.onFailure()
com uma
string explicando o erro que ocorreu.
O método mediationAdLoadCallback.onSuccess()
exige que você transmita um
objeto que confirme uma das interfaces "Ad" definidas pelo SDK dos anúncios para dispositivos móveis
do Google. Essas interfaces de anúncio pedem que você forneça algumas informações sobre o anúncio.
O MediationAdConfiguration
também tem um método getWatermark()
para retornar uma string codificada em base64 que representa uma imagem PNG. Essa imagem
precisa ser dividida em blocos em uma sobreposição transparente nos anúncios.
Entre em contato com o Google para receber mais orientações sobre como renderizar a marca d'água.
Ele contém metadados sobre o anúncio que está sendo veiculado para uso pelos editores para determinar
a origem dos anúncios veiculados.
Para banners, você vai precisar fornecer a visualização do banner. Para anúncios intersticiais e
premiados, será necessário implementar um método show()
para mostrar o anúncio em
um momento posterior. Como prática recomendada, recomendamos que a classe que
carrega o anúncio também seja responsável por implementar esses métodos de anúncio.
Confira a seguir um exemplo de implementação de loadBannerAd()
. Tenha em mente
que a implementação do adaptador será diferente, já que ele
é integrado a um SDK diferente.
public final class SampleRtbAdapter extends RtbAdapter {
...
@Override
public void loadBannerAd(
MediationBannerAdConfiguration adConfiguration,
MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> callback) {
SampleBannerRenderer bannerRenderer =
new SampleBannerRenderer(adConfiguration, callback);
bannerRenderer.render();
}
}
// Renders a banner ad, and forwards callbacks to the Google Mobile Ads SDK.
public class SampleBannerRenderer implements MediationBannerAd {
private MediationBannerAdConfiguration adConfiguration;
private final MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> adLoadCallback;
private AdView adView;
private MediationBannerAdCallback callback;
public SampleRtbBannerRenderer(
MediationBannerAdConfiguration adConfiguration,
MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> adLoadCallback) {
this.adConfiguration = adConfiguration;
this.adLoadCallback = adLoadCallback;
}
public void render() {
adView = new AdView(adConfiguration.getContext());
adView.setAdSize(adConfiguration.getAdSize());
// serverParameters are the parameters entered in the AdMob UI for your network.
adView.setAdUnitId(adConfiguration.getServerParameters().getString("adUnitId"));
// Map the callbacks from your SDK to Google's SDK.
adView.setAdListener(new AdListener() {
// See the next step for more information on callback mapping.
// ...
});
// Get the bid response and watermark from the ad configuration and
// pass the relevant information to your SDK.
String ad = adConfiguration.getBidResponse();
String watermark = adConfiguration.getWatermark();
Bundle extras = new Bundle();
extras.putString("bid", ad);
extras.putString("watermark", watermark);
AdRequest request = new AdRequest.Builder()
.addNetworkExtrasBundle(AdMobAdapter.class, extras)
.build();
adView.loadAd(request);
}
// MediationBannerAd implementation
@NonNull
@Override
public View getView() {
return adView;
}
}
Retransmitir eventos de ciclo de vida da apresentação de anúncios
A responsabilidade final do adaptador é notificar o SDK dos anúncios para dispositivos móveis do Google sobre todos os eventos do ciclo de vida da apresentação para que eles possam ser encaminhados ao editor. O editor espera esses callbacks em momentos específicos, não importa qual rede de publicidade veicule o anúncio. Por isso, é importante que o maior número possível desses callbacks seja invocado e no momento certo, para que o SDK dos anúncios para dispositivos móveis do Google possa encaminhar para o editor.
Os adaptadores precisam invocar os seguintes eventos quando aplicável:
Comum a todos os formatos | |
---|---|
Método | Quando ligar |
reportAdClicked()
|
O anúncio foi clicado. |
reportAdImpression()
|
O anúncio gerou uma impressão. |
onAdOpened()
|
O anúncio apresentou uma visualização em tela cheia. |
onAdClosed()
|
A visualização em tela cheia do anúncio foi fechada. |
onAdLeftApplication()
|
O anúncio fez com que o usuário saísse do aplicativo. |
Anúncios premiados | |
onRewarded()
|
O usuário recebe uma recompensa. |
Callbacks de vídeo (anúncios nativos e premiados) | |
onVideoStarted()
|
O vídeo do anúncio começou. |
onVideoCompleted()
|
O vídeo do anúncio foi concluído. |
O adaptador recebe um objeto MediationAdLoadCallback<MediationAdT, MediationAdCallbackT>
de volta ao chamar mediationAdLoadCallback.onSuccess()
. Espera-se
que os adaptadores mantenham esse objeto e o usem para invocar eventos de apresentação
que ocorrem no seu anúncio.
Normalmente, a maioria desses eventos é gerada pelo SDK da sua rede de publicidade. A função do adaptador é simplesmente mapear os callbacks do SDK da rede de publicidade para o SDK dos anúncios para dispositivos móveis do Google.
O exemplo a seguir demonstra como encaminhar callbacks do listener de anúncios do SDK para o SDK dos anúncios para dispositivos móveis do Google:
adView.setAdListener(new AdListener() {
public void onAdLoaded() {
callback = adLoadCallback.onSuccess(SampleBannerRenderer.this);
}
public void onAdImpression() {
if (callback != null) {
callback.reportAdImpression();
}
}
public void onAdFailedToLoad(LoadAdError adError) {
adLoadCallback.onFailure("Error: " + adError.toString());
}
public void onAdClosed() {
if (callback != null) {
callback.onAdClosed();
}
}
public void onAdOpened() {
if (callback != null) {
callback.onAdOpened();
callback.reportAdClicked();
}
}
public void onAdLeftApplication() {
if (callback != null) {
callback.onAdLeftApplication();
}
}
});
Recursos obrigatórios para o rastreamento de impressões de anúncios nativos
O SDK dos anúncios para dispositivos móveis do Google registra uma impressão de um anúncio nativo quando 1 pixel do anúncio está visível. Se o SDK da sua rede de publicidade exigir que recursos específicos sejam exibidos para renderizar uma impressão válida, o bidder poderá indicar esses recursos nativos necessários na resposta do lance. O SDK dos anúncios para dispositivos móveis do Google valida se os recursos nativos necessários são exibidos antes de registrar uma impressão.
Consulte a documentação de recursos obrigatórios nativos para mais informações sobre como especificar outros recursos obrigatórios na resposta de lance.
Mostrar erros de anúncios
Para formatos em tela cheia, como anúncios intersticiais e premiados, no callback de carga
de sucesso, você vai fornecer uma implementação de
MediationInterstitialAd
ou MediationRewardedAd
para que o SDK dos anúncios para dispositivos móveis do Google possa pedir ao adaptador que mostre o anúncio.
O SDK dos anúncios para dispositivos móveis do Google espera que, se um adaptador carregar um anúncio, ele esteja pronto para ser exibido quando o editor solicitar. Isso significa que cada chamada de exibição precisa resultar em uma impressão.
No entanto, pode haver casos em que não é possível exibir um anúncio. Se você
não conseguir mostrar o anúncio, chame o callback
onAdFailedToShow()
para cancelar a impressão.
A tabela abaixo mostra como os callbacks de apresentação afetam a gravação de impressões para formatos de anúncios em tela cheia:
Chamada de retorno | Resultado |
---|---|
onAdOpened() | Impression recorded
|
onAdFailedToShow() | Impression failure1
|
Nenhuma das opções acima por vários segundos | Impression recorded
|
1 No caso de impressões falhadas, a rede de publicidade não é cobrada pela impressão, mas ela impacta o ajuste da taxa de eventos faturáveis. Consulte Indicadores de solicitações de lances para mais informações.
O exemplo simulado a seguir demonstra um ciclo de vida de carregamento/exibição em que uma chamada de exibição de anúncio pode resultar em uma falha.
final class SampleRtbAdapter extends RtbAdapter implements MediationRewardedAd {
private MediationRewardedAdCallback callback;
private RewardedAd rewardedAd;
...
@Override
public void loadRewardedAd(
MediationRewardedAdConfiguration adConfiguration,
final MediationAdLoadCallback<MediationRewardedAd, MediationRewardedAdCallback> loadCallback) {
// Load an ad. This mock example uses Google's SDK, but in practice
// your adapter will load the ad using your ad network's SDK.
RewardedAd.load(adConfiguration.getContext(),
"ca-app-pub-3940256099942544/5224354917",
new AdRequest.Builder().build(),
new RewardedAdLoadCallback() {
@Override
public void onAdLoaded(@NonNull RewardedAd rewardedAd) {
// When the ad loads, invoke the load success callback.
callback = loadCallback.onSuccess(SampleRtbAdapter.this);
}
});
}
@Override
public void showAd(Context context) {
// In this mock example, your ad network requires an activity context, but
// didn't receive one, making you unable to show the ad.
if (!(context instanceof Activity)) {
AdError error = new AdError(1, "Context must be an activity",
"com.google.ads.mediation.sample");
callback.onAdFailedToShow(error);
}
// This example shows Google SDK's callbacks, but it's likely your SDK
// has similar presentation callbacks.
rewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() {
@Override
public void onAdShowedFullScreenContent() {
// Your ad network SDK successfully showed the ad. Call onAdOpened().
callback.onAdOpened();
}
@Override
public void onAdFailedToShowFullScreenContent(AdError adError) {
// Your ad network SDK failed to show the ad, invoke onAdFailedToShow.
// In practice, you will map your SDK's error to an AdError.
AdError error = new AdError(adError.getCode(), adError.getMessage(),
adError.getDomain());
callback.onAdFailedToShow(adError);
}
});
rewardedAd.show((Activity) context, ...);
}
}