รูปแบบโฆษณาเนทีฟที่กำหนดเอง
นอกเหนือจากรูปแบบโฆษณาเนทีฟที่ระบบกำหนดแล้ว ผู้เผยแพร่โฆษณา Ad Manager ยังมี
ในการสร้างรูปแบบโฆษณาเนทีฟของตนเองโดยกำหนดรายการที่กำหนดเอง
เนื้อหา โฆษณาเหล่านี้เรียกว่าโฆษณาเนทีฟที่กำหนดเอง
รูปแบบ และใช้ได้กับ
โฆษณาที่จองไว้ ซึ่งทำให้ผู้เผยแพร่โฆษณาส่งผ่านข้อมูลที่มีโครงสร้างที่กำหนดเองไปยัง
แอปของตนได้ โฆษณาเหล่านี้จะแสดงเป็น
NativeCustomFormatAd
ออบเจ็กต์
โหลดรูปแบบโฆษณาเนทีฟที่กำหนดเอง
คู่มือนี้จะอธิบายวิธีโหลดและแสดงรูปแบบโฆษณาเนทีฟที่กำหนดเอง
สร้าง AdLoader
เช่นเดียวกับโฆษณาเนทีฟ
รูปแบบโฆษณาเนทีฟที่กำหนดเองจะโหลดโดยใช้คลาส AdLoader
ได้แก่
Java
AdLoader adLoader = new AdLoader.Builder(context, "/21775744923/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, "/21775744923/example/native") .forCustomFormatAd("10063170", { ad -> // Show the custom format and record an impression. }, { ad, s -> // Handle the click action }) .withAdListener( ... ) .withNativeAdOptions( ... ) .build()
เมธอด forCustomFormatAd
จะกําหนดค่า AdLoader
เพื่อส่งคำขอที่กําหนดเอง
และรูปแบบโฆษณาเนทีฟ มีพารามิเตอร์ 3 ตัวที่ส่งผ่านไปยังเมธอด ได้แก่
- รหัสของรูปแบบโฆษณาเนทีฟที่กำหนดเองที่
AdLoader
ควรขอ ชิ้น รูปแบบโฆษณาเนทีฟที่กำหนดเองจะมีรหัสที่เชื่อมโยงอยู่ ช่วงเวลานี้ ระบุรูปแบบที่แอปต้องการให้AdLoader
ขอ OnCustomFormatAdLoadedListener
เพื่อเรียกใช้เมื่อโฆษณาโหลดสําเร็จ- ตัวเลือกเพิ่มเติม
OnCustomClickListener
เรียกใช้เมื่อผู้ใช้แตะหรือคลิกที่โฆษณา หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ Listener โปรดดูที่ส่วน "การจัดการคลิกและการแสดงผล" ด้านล่าง
เนื่องจากระบบสามารถตั้งค่าหน่วยโฆษณา 1 หน่วยให้แสดงครีเอทีฟโฆษณามากกว่า 1 รายการได้
รูปแบบ forCustomFormatAd
อาจเรียกได้หลายครั้งโดยใช้
รหัสรูปแบบเพื่อเตรียมตัวโหลดโฆษณาให้ครอบคลุมโฆษณาได้มากกว่า 1 รายการ
รูปแบบโฆษณาเนทีฟที่กำหนดเอง
รหัสรูปแบบโฆษณาเนทีฟที่กำหนดเอง
รหัสรูปแบบที่ใช้ระบุรูปแบบโฆษณาเนทีฟที่กำหนดเองสามารถ ใน UI ของ Ad Manager ในส่วนโฆษณาเนทีฟภายในการแสดงโฆษณา แบบเลื่อนลง:
รหัสรูปแบบโฆษณาเนทีฟที่กำหนดเองแต่ละรายการจะปรากฏอยู่ด้านข้างชื่อ คลิกที่หนึ่งใน จะนำคุณไปยังหน้าจอรายละเอียดที่แสดงข้อมูลเกี่ยวกับ ฟิลด์:
คุณจะเพิ่ม แก้ไข และนำช่องแต่ละช่องออกได้ โปรดทราบ ชื่อของแต่ละเนื้อหา ชื่อเป็นคีย์ที่ใช้ในการรับข้อมูลสำหรับ แต่ละเนื้อหา เมื่อแสดงรูปแบบโฆษณาเนทีฟที่กำหนดเอง
รูปแบบโฆษณาเนทีฟที่กำหนดเองในเครือข่ายดิสเพลย์
รูปแบบโฆษณาเนทีฟที่กำหนดเองแตกต่างจากรูปแบบที่ระบบกำหนดตรงที่ผู้เผยแพร่โฆษณา มีอำนาจในการกำหนดรายการเนื้อหาของตนเอง โฆษณา ดังนั้น กระบวนการแสดงรูปแบบดังกล่าวจึงแตกต่างจากรูปแบบที่ระบบกําหนดใน 2-3 ด้าน ดังนี้
- เนื่องจากชั้นเรียน
NativeCustomFormatAd
มีไว้เพื่อจัดการ รูปแบบโฆษณาเนทีฟที่กำหนดเองที่คุณระบุใน Ad Manager แต่ไม่ได้ตั้งชื่อ "getters" สำหรับเนื้อหา แต่จะเสนอเมธอด เช่นgetText
และgetImage
ที่นำชื่อช่องเป็นพารามิเตอร์ - ไม่มีคลาสการดูโฆษณาโดยเฉพาะ เช่น
NativeAdView
ที่จะใช้กับNativeCustomFormatAd
คุณสามารถใช้เลย์เอาต์ใดก็ได้ที่ คำนึงถึงประสบการณ์ของผู้ใช้ - ไม่มีชั้นเรียน
ViewGroup
โดยเฉพาะ คุณจึงไม่จำเป็นต้องลงทะเบียน ทุกข้อมูลพร็อพเพอร์ตี้ที่คุณใช้เพื่อแสดงเนื้อหาโฆษณา ช่วยประหยัดเวลาได้ 2-3 บรรทัด เมื่อแสดงโฆษณา แต่ก็หมายความว่าคุณจะต้องทำอะไรเพิ่มเติม จัดการกับคลิกในภายหลัง
ตัวอย่างฟังก์ชันที่แสดง NativeCustomFormatAd
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. ... }
แสดงไอคอนตัวเลือกโฆษณาอื่นๆ
การสนับสนุนกฎหมายบริการดิจิทัล (Digital Services Act หรือ DSA) โฆษณาแบบจองล่วงหน้าที่แสดงในเขตเศรษฐกิจยุโรป (EEA) ต้องมี ไอคอนตัวเลือกโฆษณาอื่นๆ และลิงก์ไปยังหน้า "เกี่ยวกับโฆษณานี้" ของ Google เมื่อใช้งานโฆษณาเนทีฟที่กำหนดเอง คุณจะเป็นผู้รับผิดชอบการแสดงผล ไอคอนตัวเลือกโฆษณาอื่นๆ เราขอแนะนำให้คุณทำตามขั้นตอนเพื่อแสดงผลและตั้งค่าการคลิก Listener ไอคอนตัวเลือกโฆษณาอื่นๆ เมื่อแสดงผลเนื้อหาโฆษณาหลัก
ตัวอย่างต่อไปนี้จะถือว่าคุณได้กำหนดเอลิเมนต์ <ImageView />
ใน
มุมมองต้นไม้เพื่อให้แสดงโลโก้ "ตัวเลือกโฆษณาอื่นๆ"
<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>
ตัวอย่างต่อไปนี้แสดงการแสดงผลไอคอนตัวเลือกโฆษณาอื่นๆ และกำหนดค่าลักษณะการคลิกที่เหมาะสม
Java
private AdSimpleCustomTemplateBinding customTemplateBinding;
private void populateAdView(final NativeCustomFormatAd nativeCustomFormatAd) {
// Render the AdChoices icon.
String adChoicesKey = NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW;
NativeAd.Image adChoicesAsset = nativeCustomFormatAd.getImage(adChoicesKey);
if (adChoicesAsset == null) {
customTemplateBinding.adChoices.setVisibility(View.GONE);
} else {
customTemplateBinding.adChoices.setVisibility(View.VISIBLE);
customTemplateBinding.adChoices.setImageDrawable(adChoicesAsset.getDrawable());
// Enable clicks on AdChoices.
customTemplateBinding.adChoices.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
nativeCustomFormatAd.performClick(adChoicesKey);
}
});
}
...
}
Kotlin
private lateinit var customTemplateBinding: AdSimpleCustomTemplateBinding
private fun populateAdView(nativeCustomFormatAd: NativeCustomFormatAd) {
// Render the AdChoices icon.
val adChoicesKey = NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW
val adChoicesAsset = nativeCustomFormatAd.getImage(adChoicesKey)
if (adChoicesAsset == null) {
customTemplateBinding.adChoices.visibility = View.GONE
} else {
customTemplateBinding.adChoices.setImageDrawable(adChoicesAsset.drawable)
customTemplateBinding.adChoices.visibility = View.VISIBLE
// Enable clicks on AdChoices.
customTemplateBinding.adChoices.setOnClickListener {
nativeCustomFormatAd.performClick(adChoicesKey)
}
}
...
}
วิดีโอเนทีฟสำหรับรูปแบบโฆษณาเนทีฟที่กำหนดเอง
เมื่อสร้างรูปแบบที่กำหนดเอง คุณจะมีตัวเลือกในการทำให้รูปแบบนั้นๆ มีสิทธิ์แสดงเป็นวิดีโอ
ในการติดตั้งใช้งานแอป คุณสามารถใช้
NativeCustomFormatAd.getMediaContent()
เพื่อดูเนื้อหาสื่อ จากนั้นโทรหา setMediaContent()
เพื่อตั้งค่าเนื้อหาสื่อในมุมมองสื่อ กับมุมมองสื่อ
หากโฆษณาไม่มีเนื้อหาวิดีโอ ให้สร้างแผนอื่นเพื่อแสดง
โดยไม่มีวิดีโอ
ตัวอย่างด้านล่างจะตรวจสอบว่าโฆษณามีเนื้อหาวิดีโอหรือไม่ และแสดงรูปภาพแทนหากไม่มีวิดีโอ
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) } }
ดู MediaContent สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีทำสิ่งต่อไปนี้ ปรับแต่งประสบการณ์การใช้งานวิดีโอของโฆษณาเนทีฟที่กำหนดเอง
ดาวน์โหลดตัวอย่างการแสดงผลที่กำหนดเองของ Ad Manager เพื่อดูตัวอย่างวิดีโอเนทีฟที่ใช้งานได้จริง
การคลิกและการแสดงผลของรูปแบบโฆษณาเนทีฟที่กำหนดเอง
เมื่อใช้รูปแบบโฆษณาเนทีฟที่กำหนดเอง แอปของคุณจะทำหน้าที่บันทึก การแสดงผลและการรายงานกิจกรรมการคลิกไปยัง SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google
บันทึกการแสดงผล
หากต้องการบันทึกการแสดงผลสําหรับโฆษณารูปแบบที่กําหนดเอง ให้เรียกrecordImpression
เมธอดในNativeCustomFormatAd
ที่เกี่ยวข้อง ดังนี้
myCustomFormatAd.recordImpression();
SDK หากแอปเรียกใช้เมธอด 2 ครั้งโดยไม่ได้ตั้งใจสำหรับโฆษณาเดียวกัน จะป้องกันไม่ให้เกิดการบันทึกการแสดงผลซ้ำสำหรับ อีกครั้ง
รายงานการคลิก
หากต้องการรายงานให้ SDK ทราบว่ามีการคลิกเกิดขึ้นในมุมมองเนื้อหา ให้เรียกใช้
performClick
ใน NativeCustomFormatAd
ที่เกี่ยวข้องและส่ง
ชื่อของชิ้นงานที่มีการคลิก ตัวอย่างเช่น หากคุณมีชิ้นงานในรูปแบบที่กำหนดเองชื่อ "MainImage" และต้องการรายงานการคลิก ImageView
ที่สอดคล้องกับชิ้นงานดังกล่าว โค้ดจะมีลักษณะดังนี้
myCustomFormatAd.performClick("MainImage");
โปรดทราบว่าคุณไม่จำเป็นต้องเรียกใช้วิธีนี้สำหรับทุกข้อมูลพร็อพเพอร์ตี้ที่เชื่อมโยงกับ
โฆษณาของคุณ หากมีช่องอื่นที่ชื่อว่า "Caption" ที่ตั้งใจจะเป็น
แสดง แต่ผู้ใช้ไม่ได้คลิกหรือแตะ แอปของคุณก็ไม่ต้องทำดังนี้
เรียก performClick
เพื่อดูชิ้นงานนั้น
ตอบสนองต่อการคลิกที่กำหนดเอง
เมื่อมีการคลิกบนโฆษณาที่มีรูปแบบที่กำหนดเอง เป็นไปได้สามประการ การตอบกลับจาก SDK พยายามตามลำดับต่อไปนี้
- เรียกใช้
OnCustomClickListener
จากAdLoader
หากมี - สำหรับ URL ของ Deep Link ของโฆษณาแต่ละรายการ ให้ลองค้นหารีโซลเวอร์เนื้อหา แล้วเริ่มรายการแรกที่แก้ปัญหาได้
- เปิดเบราว์เซอร์และไปที่ URL ปลายทางเดิมของโฆษณา
เมธอด forCustomFormatAd
ยอมรับ OnCustomClickListener
หากคุณ
ส่งออบเจ็กต์ Listener เข้ามา SDK จะเรียกเมธอด onCustomClick
แทน
และไม่ต้องดำเนินการใดๆ เพิ่มเติม อย่างไรก็ตาม หากคุณส่งค่า Null ในฐานะผู้ Listener
SDK จะกลับไปที่ Deep Link และ/หรือ URL ปลายทางที่ลงทะเบียนไว้กับ
โฆษณาของคุณ
Listener การคลิกที่กำหนดเองช่วยให้แอปของคุณตัดสินใจเลือกการดำเนินการที่ดีที่สุดได้ การตอบสนองต่อการคลิก ไม่ว่าจะเป็นการอัปเดต UI, การเปิดตัวกิจกรรมใหม่ หรือ เป็นเพียงการบันทึกการคลิกเท่านั้น นี่คือตัวอย่าง ที่บันทึกว่าการคลิกเกิดขึ้น สถานที่:
Java
AdLoader adLoader = new AdLoader.Builder(context, "/21775744923/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, "/21775744923/example/native") .forCustomFormatAd("10063170", { ad -> // Display the ad. }, { ad, assetName -> Log.i("MyApp", "A custom click just happened for $assetName!") }).build()
ในตอนแรกก็อาจฟังดูแปลกๆ ที่มี Listener คลิกที่กำหนดเองอยู่ ท้ายที่สุดแล้ว แอปของคุณเพิ่งบอก SDK ว่ามีการคลิกเกิดขึ้นแล้ว SDK จะไปรายงานเรื่องนี้กลับไปยังแอปทำไม
โฟลว์ข้อมูลนี้มีประโยชน์ด้วยเหตุผล 2-3 ประการ แต่ที่สำคัญที่สุดคือ ช่วยให้ SDK ยังคงควบคุมการตอบสนองต่อการคลิกได้ ช่วย ใช้คำสั่ง ping โดยอัตโนมัติกับ URL ติดตามผลของบุคคลที่สามซึ่งตั้งค่าไว้สำหรับ ครีเอทีฟโฆษณา รวมถึงจัดการงานอื่นๆ ในเบื้องหลังได้ รหัสเพิ่มเติม