Pré-requisitos
Conclua a configuração dos eventos personalizados.
Solicitar um anúncio nativo
Quando o item de linha do evento personalizado é alcançado na cadeia de mediação em hierarquia,
o método loadNativeAd()
é chamado no nome da classe que você forneceu ao
criar um objeto
evento. Nesse caso,
esse método está em SampleCustomEvent
, que chama
o método loadNativeAd()
na SampleNativeCustomEventLoader
.
Para solicitar um anúncio nativo, crie ou modifique uma classe que estenda Adapter
a
implementar loadNativeAd()
. Se já existir uma classe que estenda Adapter
,
implementar o loadNativeAd()
nele. Além disso, crie uma nova classe para implementar
UnifiedNativeAdMapper
:
Em nosso exemplo de evento personalizado,
SampleCustomEvent
estende a classe Adapter
e a delega para
SampleNativeCustomEventLoader
.
Java
package com.google.ads.mediation.sample.customevent; import com.google.android.gms.ads.mediation.Adapter; import com.google.android.gms.ads.mediation.MediationAdConfiguration; import com.google.android.gms.ads.mediation.MediationAdLoadCallback; import com.google.android.gms.ads.mediation.MediationNativeAdCallback; ... public class SampleCustomEvent extends Adapter { private SampleNativeCustomEventLoader nativeLoader; @Override public void loadNativeAd( @NonNull MediationNativeAdConfiguration adConfiguration, @NonNull MediationAdLoadCallback<UnifiedNativeAdMapper, MediationNativeAdCallback> callback) { nativeLoader = new SampleNativeCustomEventLoader(adConfiguration, callback); nativeLoader.loadAd(); } }
SampleNativeCustomEventLoader
é responsável pelas seguintes tarefas:
Carregar o anúncio nativo.
Implementar a classe
UnifiedNativeAdMapper
.Receber e relatar callbacks de eventos de anúncio para o SDK dos anúncios para dispositivos móveis do Google.
O parâmetro opcional definido na interface do Ad Manager é
incluído na configuração do anúncio. O parâmetro pode ser acessado pela
adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD)
:
Esse parâmetro normalmente é um identificador de bloco de anúncios que o SDK de uma rede de publicidade
exige ao instanciar um objeto de anúncio.
Java
package com.google.ads.mediation.sample.customevent; import com.google.android.gms.ads.mediation.Adapter; import com.google.android.gms.ads.mediation.MediationNativeAdConfiguration; import com.google.android.gms.ads.mediation.MediationAdLoadCallback; import com.google.android.gms.ads.mediation.MediationNativeAdCallback; ... public class SampleNativeCustomEventLoader extends SampleNativeAdListener { /** Configuration for requesting the native ad from the third-party network. */ private final MediationNativeAdConfiguration mediationNativeAdConfiguration; /** Callback that fires on loading success or failure. */ private final MediationAdLoadCallback<UnifiedNativeAdMapper, MediationNativeAdCallback> mediationAdLoadCallback; /** Callback for native ad events. */ private MediationNativeAdCallback nativeAdCallback; /** Constructor */ public SampleNativeCustomEventLoader( @NonNull MediationNativeAdConfiguration mediationNativeAdConfiguration, @NonNull MediationAdLoadCallback<MediationNativeAd, MediationNativeAdCallback> mediationAdLoadCallback) { this.mediationNativeAdConfiguration = mediationNativeAdConfiguration; this.mediationAdLoadCallback = mediationAdLoadCallback; } /** Loads the native ad from the third-party ad network. */ public void loadAd() { // Create one of the Sample SDK's ad loaders to request ads. Log.i("NativeCustomEvent", "Begin loading native ad."); SampleNativeAdLoader loader = new SampleNativeAdLoader(mediationNativeAdConfiguration.getContext()); // All custom events have a server parameter named "parameter" that returns // back the parameter entered into the UI when defining the custom event. String serverParameter = mediationNativeAdConfiguration .getServerParameters() .getString(MediationConfiguration .CUSTOM_EVENT_SERVER_PARAMETER_FIELD); Log.d("NativeCustomEvent", "Received server parameter."); loader.setAdUnit(serverParameter); // Create a native request to give to the SampleNativeAdLoader. SampleNativeAdRequest request = new SampleNativeAdRequest(); NativeAdOptions options = mediationNativeAdConfiguration.getNativeAdOptions(); if (options != null) { // If the NativeAdOptions' shouldReturnUrlsForImageAssets is true, the adapter should // send just the URLs for the images. request.setShouldDownloadImages(!options.shouldReturnUrlsForImageAssets()); request.setShouldDownloadMultipleImages(options.shouldRequestMultipleImages()); switch (options.getMediaAspectRatio()) { case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_LANDSCAPE: request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_LANDSCAPE); break; case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_PORTRAIT: request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_PORTRAIT); break; case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_SQUARE: case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_ANY: case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_UNKNOWN: default: request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_ANY); } } loader.setNativeAdListener(this); // Begin a request. Log.i("NativeCustomEvent", "Start fetching native ad."); loader.fetchAd(request); } }
Dependendo de o anúncio ser buscado ou encontrar um erro, você
chamaria
onSuccess()
ou
onFailure()
onSuccess()
é chamado transmitindo uma instância da classe que implementa
MediationNativeAd
.
Normalmente, esses métodos são implementados dentro de callbacks do
SDK de terceiros implementado pelo adaptador. Para este exemplo, o SDK de amostra
tem um SampleAdListener
com callbacks relevantes:
Java
@Override public void onNativeAdFetched(SampleNativeAd ad) { SampleUnifiedNativeAdMapper mapper = new SampleUnifiedNativeAdMapper(ad); mediationNativeAdCallback = mediationAdLoadCallback.onSuccess(mapper); } @Override public void onAdFetchFailed(SampleErrorCode errorCode) { mediationAdLoadCallback.onFailure(SampleCustomEventError.createSampleSdkError(errorCode)); }
Mapear anúncios nativos
Diferentes SDKs têm formatos próprios e exclusivos para anúncios nativos. Uma pessoa pode retornar objetos que contêm um "title" campo, por exemplo, enquanto outro poderia ter "manchete". Além disso, os métodos usados para rastrear impressões e processar os cliques podem variar de um SDK para outro.
O UnifiedNativeAdMapper
é responsável por reconciliar essas diferenças e
adaptar um objeto de anúncio nativo do SDK mediado para corresponder à interface esperada pelo
SDK dos anúncios para dispositivos móveis do Google. Eventos personalizados devem estender essa classe para criar
mapeadores próprios específicos para seu SDK mediado. Veja um exemplo de mapeador de anúncios da
nosso exemplo de projeto de evento personalizado:
Java
package com.google.ads.mediation.sample.customevent; import com.google.android.gms.ads.mediation.UnifiedNativeAdMapper; import com.google.android.gms.ads.nativead.NativeAd; ... public class SampleUnifiedNativeAdMapper extends UnifiedNativeAdMapper { private final SampleNativeAd sampleAd; public SampleUnifiedNativeAdMapper(SampleNativeAd ad) { sampleAd = ad; setHeadline(sampleAd.getHeadline()); setBody(sampleAd.getBody()); setCallToAction(sampleAd.getCallToAction()); setStarRating(sampleAd.getStarRating()); setStore(sampleAd.getStoreName()); setIcon( new SampleNativeMappedImage( ad.getIcon(), ad.getIconUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE)); setAdvertiser(ad.getAdvertiser()); List<NativeAd.Image> imagesList = new ArrayList<NativeAd.Image>(); imagesList.add(new SampleNativeMappedImage(ad.getImage(), ad.getImageUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE)); setImages(imagesList); if (sampleAd.getPrice() != null) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); String priceString = formatter.format(sampleAd.getPrice()); setPrice(priceString); } Bundle extras = new Bundle(); extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness()); this.setExtras(extras); setOverrideClickHandling(false); setOverrideImpressionRecording(false); setAdChoicesContent(sampleAd.getInformationIcon()); } @Override public void recordImpression() { sampleAd.recordImpression(); } @Override public void handleClick(View view) { sampleAd.handleClick(view); } // The Sample SDK doesn't do its own impression/click tracking, instead relies on its // publishers calling the recordImpression and handleClick methods on its native ad object. So // there's no need to pass a reference to the View being used to display the native ad. If // your mediated network does need a reference to the view, the following method can be used // to provide one. @Override public void trackViews(View containerView, Map<String, View> clickableAssetViews, Map<String, View> nonClickableAssetViews) { super.trackViews(containerView, clickableAssetViews, nonClickableAssetViews); // If your ad network SDK does its own impression tracking, here is where you can track the // top level native ad view and its individual asset views. } @Override public void untrackView(View view) { super.untrackView(view); // Here you would remove any trackers from the View added in trackView. } }
Agora, vamos analisar o código do construtor.
Mantém uma referência ao objeto de anúncio nativo mediado
O construtor aceita o parâmetro SampleNativeAd
, a classe de anúncio nativo usada
pelo SDK de amostra para os anúncios nativos. O mapeador precisa de uma referência ao
anúncio mediado para que ele possa transmitir eventos de clique e impressão. SampleNativeAd
é
armazenadas como uma variável local.
Definir propriedades de recursos mapeados
O construtor usa o objeto SampleNativeAd
para preencher recursos na
UnifiedNativeAdMapper
.
Esse snippet recebe os dados de preço do anúncio mediado e os usa para definir o valor Preço:
Java
if (sampleAd.getPrice() != null) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); String priceString = formatter.format(sampleAd.getPrice()); setPrice(priceString); }
Nesse exemplo, o anúncio mediado armazena o preço como double
, enquanto
O Ad Manager usa um String
para o mesmo recurso. A
mapeador é responsável por lidar com esses tipos de conversões.
Mapear recursos de imagem
Mapear recursos de imagem é mais complicado do que tipos de dados de mapeamento como
double
ou String
. O download das imagens pode ser feito automaticamente ou
retornados como valores de URL. As escalas de pixel para dpi também podem variar.
Para ajudar você a gerenciar esses detalhes, o SDK dos anúncios para dispositivos móveis do Google oferece a
NativeAd.Image
. Da mesma forma que é preciso criar uma subclasse
de UnifiedNativeAdMapper
para mapear um anúncio nativo mediado, crie também uma
de NativeAd.Image
ao mapear recursos de imagem.
Veja um exemplo da classe SampleNativeMappedImage
do evento personalizado:
Java
public class SampleNativeMappedImage extends NativeAd.Image { private Drawable drawable; private Uri imageUri; private double scale; public SampleNativeMappedImage(Drawable drawable, Uri imageUri, double scale) { this.drawable = drawable; this.imageUri = imageUri; this.scale = scale; } @Override public Drawable getDrawable() { return drawable; } @Override public Uri getUri() { return imageUri; } @Override public double getScale() { return scale; } }
O SampleNativeAdMapper
usa a classe de imagem mapeada nessa linha para definir o
recurso de imagem do ícone do mapeador:
Java
setIcon(new SampleNativeMappedImage(ad.getAppIcon(), ad.getAppIconUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));
Adicionar campos ao pacote de extras
Alguns SDKs mediados fornecem recursos adicionais além daqueles no
formato do anúncio nativo do Ad Manager. O UnifiedNativeAdMapper
inclui um método setExtras()
que é usado para transmitir esses recursos à
editores. O SampleNativeAdMapper
usa isso para o SDK de amostra
"grau de qualidade" recurso:
Java
Bundle extras = new Bundle(); extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness()); this.setExtras(extras);
Os editores podem recuperar os dados usando a classe NativeAd
getExtras()
.
Opções de anúncios
Seu evento personalizado é responsável por fornecer um ícone "Opções de anúncios" usando o
Método setAdChoicesContent()
em UnifiedNativeAdMapper
. Aqui está um snippet
SampleNativeAdMapper
mostrando como exibir o ícone "Opções de anúncios":
Java
public SampleNativeAdMapper(SampleNativeAd ad) { ... setAdChoicesContent(sampleAd.getInformationIcon()); }
Eventos de impressão e clique
Tanto o SDK dos anúncios para dispositivos móveis do Google quanto o SDK mediado precisam saber quando uma impressão ou clique ocorrer, mas somente um SDK precisa rastrear esses eventos. duas abordagens diferentes que os eventos personalizados podem usar, dependendo se O SDK mediado é compatível com o rastreamento de impressões e cliques por conta própria.
Acompanhar cliques e impressões com o SDK dos anúncios para dispositivos móveis do Google
Se o SDK mediado não executar o próprio rastreamento de impressões e cliques, mas
oferece métodos para registrar cliques e impressões, o SDK dos anúncios para dispositivos móveis do Google pode
rastrear esses eventos e notificar o adaptador. A
A classe UnifiedNativeAdMapper
inclui dois métodos:
recordImpression()
e handleClick()
que
eventos personalizados podem ser implementados para chamar o método correspondente na rede
objeto de anúncio nativo:
Java
@Override public void recordImpression() { sampleAd.recordImpression(); } @Override public void handleClick(View view) { sampleAd.handleClick(view); }
Como o SampleNativeAdMapper
contém uma referência ao código nativo do SDK de amostra
objeto de anúncio, ele pode chamar o método apropriado nesse objeto para relatar um clique
ou impressão. O método handleClick()
usa uma
parâmetro único: o objeto View
correspondente ao recurso de anúncio nativo que
recebeu o clique.
Rastrear cliques e impressões com o SDK mediado
Alguns SDKs mediados podem preferir rastrear cliques e impressões por conta própria. Em
nesse caso, substitua o rastreamento padrão de cliques e impressões
fazendo as duas chamadas a seguir no construtor do seu
UnifiedNativeAdMapper
:
Java
setOverrideClickHandling(true); setOverrideImpressionRecording(true);
Os eventos personalizados que substituem o rastreamento de cliques e impressões precisam
relatar os eventos onAdClicked()
e onAdImpression()
ao Google Mobile
SDK de anúncios do Google.
Para rastrear impressões e cliques, o SDK mediado provavelmente precisa de acesso à
para ativar o acompanhamento. O evento personalizado deve substituir o
trackViews()
e o use para transmitir a visualização do anúncio nativo para o
SDK a ser acompanhado. O SDK de amostra do nosso projeto de evento de exemplo personalizado (a partir do qual
snippets de código deste guia foram) não usa essa abordagem; mas se
o código do evento personalizado ficaria assim:
Java
@Override public void trackViews(View containerView, Map<String, View> clickableAssetViews, Map<String, View> nonClickableAssetViews) { sampleAd.setNativeAdViewForTracking(containerView); }
Se o SDK mediado oferecer suporte ao rastreamento de recursos individuais, ele pode analisar
clickableAssetViews
para ver quais visualizações precisam ser clicáveis. Este mapa está
codificados por um nome de recurso em NativeAdAssetNames
. O UnifiedNativeAdMapper
oferece um método untrackView()
correspondente que os eventos personalizados podem substituir.
para liberar as referências à visualização e desassociá-la do anúncio nativo
objeto.
Encaminhar eventos de mediação ao SDK dos anúncios para dispositivos móveis do Google
Você pode encontrar todos os callbacks compatíveis com a mediação na seção
documentos MediationNativeAdCallback
.
É importante que seu evento personalizado encaminhe o máximo possível desses callbacks possível, para que seu aplicativo receba esses eventos equivalentes do SDK de anúncios para dispositivos móveis. Veja um exemplo de como usar callbacks:
Isso conclui a implementação dos eventos personalizados em anúncios nativos. O exemplo completo está disponível em GitHub.