Özel Yerel Reklam Biçimleri

Özel yerel reklam biçimleri

Ad Manager yayıncıları, sistem tanımlı yerel biçimlerin yanı sıra özel öğe listeleri tanımlayarak kendi yerel reklam biçimlerini oluşturabilir. Bunlar, özel yerel reklam biçimleri olarak adlandırılır ve ayrılmış reklamlarla kullanılabilir. Bu, yayıncıların uygulamalarına rastgele yapılandırılmış verileri iletmesine olanak tanır. Bu reklamlar NativeCustomFormatAd nesnesiyle temsil edilir.

Özel yerel reklam biçimlerini yükleme

Bu kılavuzda, özel yerel reklam biçimlerinin nasıl yükleneceği ve gösterileceği açıklanmaktadır.

AdLoader Oluşturma

Yerel reklamlarda olduğu gibi özel yerel reklam biçimleri de AdLoader sınıfı kullanılarak yüklenir:

Java

AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
    .forCustomFormatAd("10063170",
      new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() {
          @Override
          public void onCustomFormatAdLoaded(NativeCustomFormatAd ad) {
              // Show the custom format and record an impression.
          }
      },
      new NativeCustomFormatAd.OnCustomClickListener() {
          @Override
          public void onCustomClick(NativeCustomFormatAd ad, String s) {
              // Handle the click action
          }
      })
    .withAdListener( ... )
    .withNativeAdOptions( ... )
    .build();

Kotlin

val adLoader = AdLoader.Builder(this, "/6499/example/native")
        .forCustomFormatAd("10063170",
            { ad ->
                // Show the custom format and record an impression.
            },
            { ad, s ->
            // Handle the click action
            })
        .withAdListener( ... )
        .withNativeAdOptions( ... )
        .build()

forCustomFormatAd yöntemi, özel yerel reklam biçimleri istemek için AdLoader öğesini yapılandırır. Yönteme üç parametre iletilir:

  • AdLoader öğesinin istemesi gereken özel yerel reklam biçiminin kimliği. Her özel yerel reklam biçiminin, kendisiyle ilişkilendirilmiş bir kimliği vardır. Bu parametre, uygulamanızın AdLoader ile hangi biçimi istemesini istediğini belirtir.
  • Reklam başarıyla yüklendiğinde çağrılacak bir OnCustomFormatAdLoadedListener.
  • Kullanıcı reklama dokunduğunda veya tıkladığında çağrılacak isteğe bağlı bir OnCustomClickListener. Bu işleyici hakkında daha fazla bilgi için aşağıdaki "Tıklamaları ve gösterimleri işleme" bölümüne bakın.

Tek bir reklam birimi birden fazla reklam öğesi biçimini sunacak şekilde ayarlanabileceğinden, forCustomFormatAd reklam yükleyiciyi olası birden fazla özel yerel reklam biçimine hazırlamak için benzersiz biçim kimlikleriyle birden fazla kez çağrılabilir.

Özel yerel reklam biçimi kimliği

Özel bir yerel reklam biçimini tanımlamak için kullanılan biçim kimliği, Ad Manager kullanıcı arayüzünde Yayınlama açılır listesindeki Yerel bölümü altında bulunabilir:

Her özel yerel reklam biçimi kimliği, adının yanında görünür. Adlardan birini tıkladığınızda, biçimin alanlarıyla ilgili bilgileri gösteren ayrıntılar ekranına yönlendirilirsiniz:

Buradan bağımsız alanlar ekleyebilir, düzenleyebilir ve kaldırabilirsiniz. Her bir öğenin adını not edin. Ad, özel yerel reklam biçiminizi görüntülerken her bir öğenin verilerini almak için kullanılan anahtardır.

Görüntülü özel yerel reklam biçimleri

Özel yerel reklam biçimleri, yayıncıların bir reklamı oluşturan kendi öğe listesini tanımlama gücüne sahip olması açısından sistem tanımlı reklam biçimlerinden farklıdır. Bu nedenle, bir dosyayı görüntüleme işlemi birkaç açıdan sistem tanımlı biçimlerden farklıdır:

  1. NativeCustomFormatAd sınıfının, Ad Manager'da tanımladığınız özel yerel reklam biçimlerinden herhangi birini işlemesi amaçlandığından, öğeler için "getters" olarak adlandırılmamıştır. Bunun yerine, alanın adını parametre olarak alan getText ve getImage gibi yöntemler sunar.
  2. NativeCustomFormatAd ile kullanılabilecek NativeAdView gibi özel bir reklam görüntüleme sınıfı yok. Kullanıcı deneyimi için mantıklı olan her düzeni kullanabilirsiniz.
  3. Özel bir ViewGroup sınıfı olmadığından, reklamın öğelerini görüntülemek için kullandığınız görünümlerden hiçbirini kaydetmeniz gerekmez. Bu işlem, reklamı görüntülerken birkaç satır koddan tasarruf etmenizi sağlar, ancak daha sonra tıklamaları ele almak için ekstra işlem yapmanız gerektiği anlamına da gelir.

Burada, NativeCustomFormatAd görüntüleyen bir örnek işlev verilmiştir:

Java

public void displayCustomFormatAd (ViewGroup parent,
                                     NativeCustomFormatAd customFormatAd) {
    // Inflate a layout and add it to the parent ViewGroup.
    LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View adView = inflater.inflate(R.layout.custom_format_ad, parent);

    // Locate the TextView that will hold the value for "Headline" and
    // set its text.
    TextView myHeadlineView = (TextView) adView.findViewById(R.id.headline);
    myHeadlineView.setText(customFormatAd.getText("Headline"));

    // Locate the ImageView that will hold the value for "MainImage" and
    // set its drawable.
    Button myMainImageView = (ImageView) adView.findViewById(R.id.main_image);
    myMainImageView.setImageDrawable(
            customFormatAd.getImage("MainImage").getDrawable());

    ...
    // Continue locating views and displaying assets until finished.
    ...
}

Kotlin

public fun displayCustomFormatAd (parent: ViewGroup,
                                customFormatAd: NativeCustomFormatAd) {
    val adView = layoutInflater
            .inflate(R.layout.ad_simple_custom_format, null)

    val myHeadlineView = adView.findViewById<TextView>(R.id.headline)
    myHeadlineView.setText(customFormatAd.getText("Headline"));

    // Locate the ImageView that will hold the value for "MainImage" and
    // set its drawable.
    val myMainImageView = adView.findViewById(R.id.main_image);
    myMainImageView.setImageDrawable(
            customFormatAd.getImage("MainImage").drawable;

    ...
    // Continue locating views and displaying assets until finished.
    ...
}

Özel yerel reklam biçimleri için yerel video

Özel biçim oluştururken bu biçimi video için uygun hale getirme seçeneğiniz vardır.

Uygulama uygulamanızda medya içeriğini almak için NativeCustomFormatAd.getMediaContent() kullanılabilir. Ardından, medya görünümünüzdeki medya içeriğini kendi medya görünümünüze göre ayarlamak için setMediaContent() numaralı telefonu arayın. Reklamın video içeriği yoksa reklamı video olmadan göstermek için alternatif planlar yapın.

Aşağıdaki örnekte, reklamın video içeriği olup olmadığı kontrol edilir ve video yoksa yerine bir resim gösterilir:

Java

// Called when a custom native ad loads.
@Override
public void onCustomFormatAdLoaded(final NativeCustomFormatAd ad) {

  MediaContent mediaContent = ad.getMediaContent();

  // Assumes you have a FrameLayout in your view hierarchy with the id media_placeholder.
  FrameLayout mediaPlaceholder = (FrameLayout) findViewById(R.id.media_placeholder);

  // Apps can check the MediaContent's hasVideoContent property to determine if the
  // NativeCustomFormatAd has a video asset.
  if (mediaContent != null && mediaContent.hasVideoContent()) {
    MediaView mediaView = new MediaView(mediaPlaceholder.getContext());
    mediaView.setMediaContent(mediaContent);
    mediaPlaceholder.addView(mediaView);

    // Create a new VideoLifecycleCallbacks object and pass it to the VideoController. The
    // VideoController will call methods on this object when events occur in the video
    // lifecycle.
    VideoController vc = mediaContent.getVideoController();
    vc.setVideoLifecycleCallbacks(
        new VideoController.VideoLifecycleCallbacks() {
          @Override
          public void onVideoEnd() {
            // Publishers should allow native ads to complete video playback before
            // refreshing or replacing them with another ad in the same UI location.
            super.onVideoEnd();
          }
        });
  } else {
    ImageView mainImage = new ImageView(this);
    mainImage.setAdjustViewBounds(true);
    mainImage.setImageDrawable(ad.getImage("MainImage").getDrawable());
    mediaPlaceholder.addView(mainImage);
    mainImage.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View view) {
            ad.performClick("MainImage");
          }
        });
  }
}

Kotlin

// Called when a custom native ad loads.
NativeCustomFormatAd.OnCustomFormatAdLoadedListener { ad ->

  val mediaContent = ad.mediaContent

  // Apps can check the MediaContent's hasVideoContent property to determine if the
  // NativeCustomFormatAd has a video asset.
  if (mediaContent != null && mediaContent.hasVideoContent()) {
    val mediaView = MediaView(mediaPlaceholder.getContest())
    mediaView.mediaContent = mediaContent

    val videoController = mediaContent.videoController

    // Create a new VideoLifecycleCallbacks object and pass it to the VideoController. The
    // VideoController will call methods on this object when events occur in the video
    // lifecycle.
    if (videoController != null) {
      videoController.videoLifecycleCallbacks =
        object : VideoController.VideoLifecycleCallbacks() {
          override fun onVideoEnd() {
            // Publishers should allow native ads to complete video playback before refreshing
            // or replacing them with another ad in the same UI location.
            super.onVideoEnd()
          }
        }
    }
  } else {
    val mainImage = ImageView(this)
    mainImage.adjustViewBounds = true
    mainImage.setImageDrawable(ad.getImage("MainImage")?.drawable)

    mainImage.setOnClickListener { ad.performClick("MainImage") }
    customTemplateBinding.simplecustomMediaPlaceholder.addView(mainImage)
  }
}

Özel bir yerel reklamın video deneyimini nasıl özelleştirebileceğiniz hakkında daha fazla bilgi için MediaContent konusuna bakın.

Çalışan bir yerel video örneği için Ad Manager Özel Oluşturma örneğini indirin.

Özel yerel reklam biçimi tıklamaları ve gösterimleri

Özel yerel reklam biçimleriyle uygulamanız, gösterimleri kaydetmek ve tıklama etkinliklerini Google Mobile Ads SDK'sına raporlamakla yükümlüdür.

Gösterimleri kaydet

Özel biçimli bir reklamla ilgili gösterim kaydetmek için ilgili NativeCustomFormatAd öğesinde recordImpression yöntemini çağırın:

myCustomFormatAd.recordImpression();

Uygulamanız aynı reklam için bu yöntemi yanlışlıkla iki kez çağırırsa SDK, tek bir istek için yinelenen gösterimin kaydedilmesini otomatik olarak engeller.

Rapor tıklamaları

Öğe görünümünde bir tıklamanın gerçekleştiğini SDK'ya bildirmek için karşılık gelen NativeCustomFormatAd öğesinde performClick yöntemini çağırın ve tıklanan öğenin adını iletin. Örneğin, özel biçiminizde "MainImage" adlı bir öğeniz varsa ve bu öğeye karşılık gelen ImageView öğesini raporlamak istiyorsanız kodunuz aşağıdaki gibi görünür:

myCustomFormatAd.performClick("MainImage");

Reklamınızla ilişkilendirilen her görüntüleme için bu yöntemi çağırmanız gerekmediğini unutmayın. Görüntülenmesi amaçlanan ancak kullanıcı tarafından tıklanmayan veya tıklanmayan "Başlık" adlı başka bir alanınız varsa uygulamanızın bu öğenin görünümü için performClick işlevini çağırması gerekmez.

Özel tıklama işlemlerine yanıt verme

Özel biçimli bir reklamda tıklama yapıldığında SDK'dan gelen üç olası yanıt şu sırayla denenir:

  1. Sağlanmışsa AdLoader öğesinden OnCustomClickListener öğesini çağırın.
  2. Reklamın derin bağlantı URL'lerinin her biri için bir içerik çözümleyici bulmaya çalışın ve çözümleyen ilk URL'yi başlatın.
  3. Bir tarayıcı açın ve reklamın geleneksel Hedef URL'sine gidin.

forCustomFormatAd yöntemi OnCustomClickListener kabul eder. Bir işleyici nesnesi iletirseniz SDK bunun yerine onCustomClick yöntemini çağırır ve başka bir işlem yapmaz. Ancak işleyici olarak null değer iletirseniz SDK, reklamla kaydedilen derin bağlantıya ve/veya hedef URL'lere geri döner.

Özel Tıklama işleyicileri, uygulamanızın bir tıklamaya yanıt olarak gerçekleştirilecek en iyi işleme (kullanıcı arayüzünü güncellemek, yeni bir etkinlik başlatmak veya yalnızca tıklamayı günlüğe kaydetmek) karar vermesine olanak tanır. Aşağıda, yalnızca bir tıklamanın gerçekleştiğini günlüğe kaydeden bir örnek verilmiştir:

Java

AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
    .forCustomFormatAd("10063170",
      new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() {
        // Display the ad.
      },
      new NativeCustomFormatAd.OnCustomClickListener() {
          @Override
          public void onCustomClick(NativeCustomFormatAd ad, String assetName) {
            Log.i("MyApp", "A custom click just happened for " + assetName + "!");
          }
      }).build();

Kotlin

val adLoader = AdLoader.Builder(this, "/6499/example/native")
    .forCustomFormatAd("10063170",
        { ad ->
            // Display the ad.
        },
        { ad, assetName ->
                Log.i("MyApp", "A custom click just happened for $assetName!")
    }).build()

İlk başta, özel tıklama işleyicilerin mevcut olması garip görünebilir. Sonuçta, uygulamanız SDK'ya az önce bir tıklama gerçekleştiğini söyledi. Peki, SDK neden geri dönüp bunu uygulamaya bildirsin?

Bu bilgi akışı birkaç nedenden dolayı faydalıdır ancak en önemlisi, SDK'nın tıklamaya verilen yanıtın kontrolünü elinde tutmasına olanak tanır. Örneğin, reklam öğesi için ayarlanmış üçüncü taraf izleme URL'lerini otomatik olarak pingleyebilir ve herhangi bir ek kod olmadan sahne arkasındaki diğer görevleri gerçekleştirebilir.