Pular para o conteúdo

Nativo

Os anúncios nativos são um tipo de anúncio que pode ser exibido usando o mesmo estilo visual do restante do app, o que permite uma integração natural e não intrusiva com a interface do usuário.

Diferentemente dos outros formatos, o app fornece o layout e o SDK o preenche com os assets do anúncio, independentemente de qual fonte de demanda o tenha preenchido.

O primeiro passo é criar o layout que será usado para exibir os anúncios. Trata-se de um arquivo de layout comum, em que cada view que exibirá um asset do anúncio precisa de um identificador:

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/ad_headline"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<FrameLayout
android:id="@+id/ad_media"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="120dp" />
<Button
android:id="@+id/ad_call_to_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

Com o layout pronto, uma instância de NativeAdViewBinder o conecta ao SDK. Apenas o layoutId é obrigatório, então você pode vincular somente os assets que o seu layout exibe:

val binder = NativeAdViewBinder.Builder(R.layout.native_ad)
.setAdvertiserTextViewId(R.id.ad_advertiser)
.setBodyTextViewId(R.id.ad_body)
.setCallToActionButtonId(R.id.ad_call_to_action)
.setHeadlineTextViewId(R.id.ad_headline)
.setIconImageViewId(R.id.ad_app_icon)
.setMediaContentViewId(R.id.ad_media)
.setPriceTextViewId(R.id.ad_price)
.setRatingContentViewId(R.id.ad_rating)
.setStoreTextViewId(R.id.ad_store)
.build()

O builder aceita os seguintes assets:

MétodoObrigatórioDescrição
setAdChoicesContentViewId(int)NãoContêiner para o ícone do AdChoices
setAdvertiserTextViewId(int)NãoNome do anunciante
setBodyTextViewId(int)NãoDescrição do anúncio
setCallToActionButtonId(int)NãoBotão que convida o usuário a interagir com o anúncio
setHeadlineTextViewId(int)NãoTítulo do anúncio
setIconImageViewId(int)NãoÍcone do anúncio
setMediaContentViewId(int)NãoContêiner para o conteúdo de mídia (imagem ou vídeo)
setOptionsContentViewId(int)NãoContêiner para a view de opções do anúncio
setPriceTextViewId(int)NãoPreço do produto promovido
setRatingContentViewId(int)NãoContêiner para a avaliação do produto promovido
setStoreTextViewId(int)NãoLoja do produto promovido

Para solicitar um anúncio nativo, você precisa fazer uma integração por código como mostrado no exemplo abaixo:

class MainActivity : Activity() {
private var nativeAd: NativeAd? = null
private var nativeAdLoader: NativeAdLoader? = null
// O binder criado na seção anterior
private val binder = NativeAdViewBinder.Builder(R.layout.native_ad)
.setCallToActionButtonId(R.id.ad_call_to_action)
.setHeadlineTextViewId(R.id.ad_headline)
.setMediaContentViewId(R.id.ad_media)
.build()
override fun onCreate(savedInstanceState: Bundle?) {
...
nativeAdLoader = NativeAdLoader(
this, "Ad Unit ID da Wortise", nativeListener).also {
it.loadAd()
}
}
override fun onDestroy() {
...
nativeAd?.destroy()
nativeAdLoader?.destroy()
}
private val nativeListener = object : NativeAdLoader.Listener {
override fun onNativeClicked(ad: NativeAd) {
// Invocado quando o anúncio foi clicado
}
override fun onNativeFailedToLoad(error: AdError) {
// Invocado quando não foi possível carregar o anúncio
// (por causa de um erro ou sem preenchimento (no fill))
}
override fun onNativeImpression(ad: NativeAd) {
// Invocado quando o anúncio gerou uma impressão
}
override fun onNativeLoaded(ad: NativeAd) {
// Invocado quando o anúncio foi carregado
nativeAd?.destroy()
nativeAd = ad
val adView = NativeAdView(this@MainActivity, binder)
// Por exemplo, adicionamos o NativeAdView em um FrameLayout
val frameLayout = findViewById<FrameLayout>(R.id.frame)
frameLayout.removeAllViews()
frameLayout.addView(adView)
nativeAdLoader?.renderAd(adView, ad)
}
override fun onNativeRevenuePaid(ad: NativeAd, data: RevenueData) {
// Invocado quando o anúncio gerou receita
}
}
}

O método renderAd preenche as views do layout com os assets do anúncio e as registra para rastrear os cliques e as impressões. Ele retorna false quando não foi possível renderizar o anúncio.

A classe NativeAd expõe os assets do anúncio, que podem ser usados para personalizar o layout antes de renderizá-lo:

PropriedadeTipoDescrição
advertiserString?Nome do anunciante
bodyString?Descrição do anúncio
callToActionString?Texto da chamada para ação
headlineString?Título do anúncio
iconImage?Ícone do anúncio
imagesList<Image>Imagens do anúncio
mediaContentMediaContent?Conteúdo de mídia do anúncio (imagem ou vídeo)
priceString?Preço do produto promovido
ratingDouble?Avaliação do produto promovido
storeString?Loja do produto promovido

O método loadAd também aceita uma instância de RequestParameters, da mesma forma que os demais formatos:

nativeAdLoader?.loadAd(RequestParameters(agent = "seu agente"))

Se o seu app já integrou a classe descontinuada GoogleNativeAd, estas são as equivalências com a nova integração:

DescontinuadoSubstituição
GoogleNativeAd(context, adUnitId, listener)NativeAdLoader(context, adUnitId, listener)
GoogleNativeAd.ListenerNativeAdLoader.Listener
load()loadAd() (ou loadAd(parameters))
onNativeLoaded(ad, nativeAd)onNativeLoaded(ad) — um NativeAd, sem tipo do Google
onNativeFailedToLoad(ad, error)onNativeFailedToLoad(error)
withNativeAdOptions(options)removido — o SDK configura a requisição
Seu próprio NativeAdView do Google e a vinculação dos assetsNativeAdViewBinder + NativeAdView + renderAd

Na prática, as mudanças são:

  1. Abandone os tipos do Google. Não há mais com.google.android.gms.ads.nativead.NativeAd nos callbacks, então o app não precisa mais importar as classes do Google Mobile Ads para anúncios nativos.
  2. Descreva o layout uma única vez. Em vez de buscar cada view e atribuí-la ao NativeAdView do Google, declare os identificadores em um NativeAdViewBinder conforme explicado na seção Layout do anúncio.
  3. Renderize por meio do loader. Onde o app costumava configurar o NativeAdView do Google e atribuir o anúncio a ele, agora ele cria um NativeAdView com o binder e chama renderAd.
override fun onNativeLoaded(ad: GoogleNativeAd, nativeAd: NativeAd) {
val adView = // seu NativeAdView do Google
adView.headlineView = adView.findViewById(R.id.ad_headline)
adView.callToActionView = adView.findViewById(R.id.ad_call_to_action)
adView.mediaView = adView.findViewById(R.id.ad_media)
// ... uma linha por asset ...
adView.setNativeAd(nativeAd)
}
override fun onNativeLoaded(ad: NativeAd) {
val adView = NativeAdView(context, binder)
nativeAdLoader?.renderAd(adView, ad)
}

Os apps que ainda usam GoogleNativeAd recebem a instância NativeAd do Google no callback onNativeLoaded e são responsáveis por construir o NativeAdView e registrar cada asset, conforme descrito na documentação do Google.