Używanie niestandardowych formatów reklam natywnych

Oprócz formatów natywnych zdefiniowanych przez system wydawcy Ad Managera mogą tworzyć własne formaty reklam natywnych, definiując niestandardowe listy zasobów. Są to niestandardowe formaty reklam natywnych, których można używać w przypadku reklam z rezerwacji. Umożliwia to wydawcom przekazywanie do aplikacji dowolnych danych strukturalnych. Te reklamy są reprezentowane przez NativeCustomFormatAd obiekt.

Wczytywanie niestandardowych formatów reklam natywnych

Z tego przewodnika dowiesz się, jak wczytywać i wyświetlać niestandardowe formaty reklam natywnych.

Wczytywanie niestandardowej reklamy natywnej

Aby wczytać niestandardową reklamę natywną:

  1. W NativeAdRequest uwzględnij typ reklamy NativeAdType.CUSTOM_NATIVE.

  2. Ustaw identyfikator formatu niestandardowej reklamy natywnej.

Kotlin

val adRequest =
  NativeAdRequest.Builder("AD_UNIT_ID", listOf(NativeAdType.CUSTOM_NATIVE))
    .setCustomFormatIds(listOf("CUSTOM_NATIVE_FORMAT_ID"))
    .build()

// Load the native ad with the ad request and callback.
NativeAdLoader.load(
  adRequest,
  object : NativeAdLoaderCallback {
    override fun onCustomNativeAdLoaded(customNativeAd: CustomNativeAd) {
      // TODO: Store the custom native ad.
    }

    override fun onAdFailedToLoad(adError: LoadAdError) {}
  },
)

Java

NativeAdRequest adRequest =
    new NativeAdRequest.Builder("AD_UNIT_ID", List.of(NativeAd.NativeAdType.CUSTOM_NATIVE))
        .setCustomFormatIds(Arrays.asList("CUSTOM_NATIVE_FORMAT_ID"))
        .build();

// Load the native ad with the ad request and callback.
NativeAdLoader.load(
    adRequest,
    new NativeAdLoaderCallback() {
      @Override
      public void onCustomNativeAdLoaded(@NonNull CustomNativeAd customNativeAd) {
        // TODO: Store the custom native ad.
      }

      @Override
      public void onAdFailedToLoad(@NonNull LoadAdError adError) {}
    });

Identyfikator niestandardowego formatu reklamy natywnej

Identyfikator formatu używany do identyfikowania niestandardowego formatu reklamy natywnej znajdziesz w interfejsie Ad Managera w sekcji Natywne w menu Dostarczanie:

Każdy identyfikator niestandardowego formatu reklamy natywnej jest wyświetlany obok jego nazwy. Kliknięcie jednej z nazw powoduje przejście do ekranu szczegółów z informacjami o polach formatu:

W tym miejscu można dodawać, edytować i usuwać poszczególne pola. Zwróć uwagę na nazwę każdego zasobu. Nazwa jest kluczem używanym do pobierania danych każdego zasobu podczas wyświetlania niestandardowego formatu reklamy natywnej.

Wyświetlanie niestandardowych formatów reklam natywnych

Niestandardowe formaty reklam natywnych różnią się od formatów zdefiniowanych przez system tym, że wydawcy mogą definiować własną listę zasobów składających się na reklamę. Dlatego proces wyświetlania różni się od formatów zdefiniowanych przez system na kilka sposobów:

  1. Zasoby tekstowe i graficzne są dostępne za pomocą metod pobierających getText() i getImage(), które przyjmują nazwę pola jako parametr.
  2. Ponieważ nie ma dedykowanej klasy ViewGroup, którą można zarejestrować w Google, musisz ręcznie rejestrować wyświetlenia i kliknięcia.
  3. Niestandardowa reklama natywna ma treść multimedialną null, jeśli nie zawiera zasobu wideo.

Ten przykład pokazuje, jak wyświetlić CustomNativeAd:

Kotlin

private fun displayCustomNativeAd(customNativeAd: CustomNativeAd, context: Context) {
  // Render the text elements.

  // The `customNativeAdBinding` is the layout binding for the ad container that
  // contains all `CustomNativeAd` assets.
  customNativeAdBinding.headline.text = customNativeAd.getText("Headline")
  customNativeAdBinding.caption.text = customNativeAd.getText("Caption")

  // If the main asset is an image, render it with an ImageView.
  val imageView = ImageView(context)
  imageView.adjustViewBounds = true
  imageView.setImageDrawable(customNativeAd.getImage("MainImage")?.drawable)
  imageView.setOnClickListener { customNativeAd.performClick("MainImage") }
  customNativeAdBinding.mediaPlaceholder.addView(imageView)

  // Render the ad choices icon.
  renderAdChoices(customNativeAd)

  // Record an impression.
  customNativeAd.recordImpression()
}

Java

private void displayCustomNativeAd(CustomNativeAd customNativeAd, Context context) {
  // Render the text elements.

  // The `customNativeAdBinding` is the layout binding for the ad container that
  // contains all `CustomNativeAd` assets.
  if (customNativeAdBinding != null) {
    customNativeAdBinding.headline.setText(customNativeAd.getText("Headline"));
    customNativeAdBinding.caption.setText(customNativeAd.getText("Caption"));

    ImageView imageView = new ImageView(context);
    imageView.setAdjustViewBounds(true);
    imageView.setImageDrawable(customNativeAd.getImage("MainImage").getDrawable());
    imageView.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            customNativeAd.performClick("MainImage");
          }
        });
    customNativeAdBinding.mediaPlaceholder.addView(imageView);

    // Render the ad choices icon.
    renderAdChoices(customNativeAd);

    // Record an impression.
    customNativeAd.recordImpression();
  }
}

Natywne reklamy wideo w niestandardowych formatach reklam natywnych

Podczas tworzenia formatu niestandardowego, możesz określić, czy ma on kwalifikować się do wyświetlania reklam wideo.

W implementacji aplikacji możesz użyć CustomNativeAd.getMediaContent() aby uzyskać treść multimedialną. Następnie wywołaj setMediaContent() , aby ustawić treść multimedialną w widoku multimediów. Jeśli reklama ma treść multimedialną null, przygotuj alternatywne plany wyświetlania reklamy bez filmu.

Poniższy przykład sprawdza, czy reklama zawiera treść wideo, i wyświetla obraz w jej miejsce, jeśli film jest niedostępny:

Kotlin

private fun displayVideoCustomNativeAd(customNativeAd: CustomNativeAd, context: Context) {
  // Check whether the custom native ad has video content.
  val mediaContent = customNativeAd.mediaContent
  if (mediaContent != null && mediaContent.hasVideoContent) {
    // Render the media content in a MediaView.
    val mediaView = MediaView(context)
    mediaView.mediaContent = mediaContent
    customNativeAdBinding.mediaPlaceholder.addView(mediaView)
  } else {
    // Fall back to other assets defined on your custom native ad.
    val imageView = ImageView(context)
    imageView.adjustViewBounds = true
    imageView.setImageDrawable(customNativeAd.getImage("MainImage")?.drawable)
    customNativeAdBinding.mediaPlaceholder.addView(imageView)
  }

  // Record an impression.
  customNativeAd.recordImpression()
}

Java

private void displayVideoCustomNativeAd(CustomNativeAd customNativeAd, Context context) {
  // Check whether the custom native ad has video content.
  MediaContent mediaContent = customNativeAd.getMediaContent();
  if (mediaContent != null && mediaContent.getHasVideoContent()) {
    // Render the media content in a MediaView.
    MediaView mediaView = new MediaView(context);
    mediaView.setMediaContent(mediaContent);
    customNativeAdBinding.mediaPlaceholder.addView(mediaView);
  } else {
    // Fall back to other assets defined on your custom native ad.
    ImageView imageView = new ImageView(context);
    imageView.setAdjustViewBounds(true);
    imageView.setImageDrawable(customNativeAd.getImage("MainImage").getDrawable());
    customNativeAdBinding.mediaPlaceholder.addView(imageView);
  }

  // Record an impression.
  customNativeAd.recordImpression();
}

Więcej informacji o tym, jak dostosować wyświetlanie filmów w niestandardowej reklamie natywnej, znajdziesz w artykule Reklamy wideo.

Renderowanie ikony Informacja

W ramach wspierania aktu o usługach cyfrowych, reklamy rezerwowane wyświetlane w Europejskim Obszarze Gospodarczym (EOG) muszą zawierać ikonę AdChoices i link do strony Google Informacje o tej reklamie. Podczas implementowania niestandardowych reklam natywnych odpowiadasz za renderowanie ikony Informacja. Zalecamy podjęcie działań w celu renderowania ikony Informacja i ustawienia detektora kliknięć podczas renderowania głównych komponentów reklamy.

W poniższym przykładzie zakłada się, że w hierarchii widoków zdefiniowano element <ImageView />, który będzie zawierać logo AdChoices.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView
        android:id="@+id/adChoices"
        android:layout_width="15dp"
        android:layout_height="15dp"
        android:adjustViewBounds="true"
        android:contentDescription="AdChoices icon." />
</LinearLayout>

Poniższe przykłady renderują ikonę Informacja i konfigurują odpowiednie działanie po kliknięciu.

Kotlin

private fun renderAdChoices(customNativeAd: CustomNativeAd) {
  // Render the AdChoices image.
  val adChoiceAsset = customNativeAd.getImage(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW)
  if (adChoiceAsset != null) {
    customNativeAdBinding.adchoices.setImageDrawable(adChoiceAsset.drawable)
    customNativeAdBinding.adchoices.visibility = View.VISIBLE
    customNativeAdBinding.adchoices.setOnClickListener {
      // Handle click. See the next section for more details.
      customNativeAd.performClick(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW)
    }
  } else {
    customNativeAdBinding.adchoices.visibility = View.GONE
  }
}

Java

private void renderAdChoices(CustomNativeAd customNativeAd) {
  // Render the AdChoices image.
  Image adChoiceAsset =
      customNativeAd.getImage(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW);
  if (adChoiceAsset != null) {
    if (customNativeAdBinding != null) {
      customNativeAdBinding.adchoices.setImageDrawable(adChoiceAsset.getDrawable());
      customNativeAdBinding.adchoices.setVisibility(View.VISIBLE);
      customNativeAdBinding.adchoices.setOnClickListener(
          new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              // Handle click.
              customNativeAd.performClick(NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW);
            }
          });
    }
  } else {
    if (customNativeAdBinding != null) {
      customNativeAdBinding.adchoices.setVisibility(View.GONE);
    }
  }
}

Rejestrowanie wyświetleń i raportowanie kliknięć

Twoja aplikacja odpowiada za rejestrowanie wyświetleń i raportowanie zdarzeń kliknięć do GMA Next-Gen SDK.

Rejestrowanie wyświetleń

Aby zarejestrować wyświetlenie niestandardowej reklamy natywnej, wywołaj metodę recordImpression() reklamy:

Kotlin

// Record an impression.
customNativeAd.recordImpression()

Java

// Record an impression.
customNativeAd.recordImpression();

Jeśli aplikacja przypadkowo wywoła tę metodę 2 razy w przypadku tej samej reklamy, pakiet SDK automatycznie uniemożliwi zarejestrowanie zduplikowanego wyświetlenia w przypadku pojedynczego żądania.

Raportowanie kliknięć

Aby poinformować pakiet SDK o kliknięciu widoku zasobu, wywołaj metodę performClick() reklamy. Podaj nazwę klikniętego zasobu, używając tego samego ciągu znaków, który został zdefiniowany w interfejsie Ad Managera.

Kotlin

imageView.setOnClickListener { customNativeAd.performClick("MainImage") }

Java

imageView.setOnClickListener(
    new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        customNativeAd.performClick("MainImage");
      }
    });

Pamiętaj, że nie musisz wywoływać tej metody w przypadku każdego widoku powiązanego z reklamą. Jeśli masz inne pole o nazwie „Podpis”, które ma być wyświetlane, ale nie ma być klikane ani dotykane przez użytkownika, aplikacja nie musi wywoływać metody performClick w przypadku widoku tego zasobu.

Reagowanie na niestandardowe działania po kliknięciu

Gdy klikniesz reklamę w formacie niestandardowym, pakiet SDK może zareagować na 3 sposoby, w tej kolejności:

  1. Wywołaj OnCustomClickListener, jeśli został podany.
  2. W przypadku każdego adresu URL precyzyjnego linku reklamy spróbuj znaleźć moduł rozpoznawania treści i uruchomić pierwszy, który się rozwiąże.
  3. Otwórz przeglądarkę i przejdź do docelowego adresu URL reklamy.

Aby zaimplementować niestandardowe działanie po kliknięciu, podaj OnCustomClickListener:

Kotlin

customNativeAd.onCustomClickListener =
  object : OnCustomClickListener {
    override fun onCustomClick(assetName: String) {
      // Perform your custom action.
    }
  }

Java

customNativeAd.setOnCustomClickListener(
    new OnCustomClickListener() {
      @Override
      public void onCustomClick(@NonNull String assetName) {
        // Perform your custom action.
      }
    });

Na początku może się wydawać dziwne, że istnieją niestandardowe detektory kliknięć. W końcu aplikacja właśnie poinformowała pakiet SDK o kliknięciu, więc dlaczego pakiet SDK miałby to zgłaszać aplikacji?

Ten przepływ informacji jest przydatny z kilku powodów, ale najważniejsze jest to, że pozwala pakietowi SDK zachować kontrolę nad reakcją na kliknięcie. Może on automatycznie wysyłać pingi do linków monitorujących firmy zewnętrznej, które zostały ustawione w kreacji, i wykonywać inne zadania za kulisami bez dodatkowego kodu.