Ö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ınAdLoader
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:
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 alangetText
vegetImage
gibi yöntemler sunar.NativeCustomFormatAd
ile kullanılabilecekNativeAdView
gibi özel bir reklam görüntüleme sınıfı yok. Kullanıcı deneyimi için mantıklı olan her düzeni kullanabilirsiniz.- Ö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:
- Sağlanmışsa
AdLoader
öğesindenOnCustomClickListener
öğesini çağırın. - 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.
- 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.