รูปแบบโฆษณาเนทีฟที่กำหนดเอง

รูปแบบโฆษณาเนทีฟที่กำหนดเอง

นอกเหนือจากรูปแบบโฆษณาเนทีฟที่ระบบกำหนดแล้ว ผู้เผยแพร่โฆษณา Ad Manager ยังมี ในการสร้างรูปแบบโฆษณาเนทีฟของตนเองโดยกำหนดรายการที่กำหนดเอง เนื้อหา โฆษณาเหล่านี้เรียกว่าโฆษณาเนทีฟที่กำหนดเอง รูปแบบ และใช้ได้กับ โฆษณาที่จองไว้ ซึ่งทำให้ผู้เผยแพร่โฆษณาส่งผ่านข้อมูลที่มีโครงสร้างที่กำหนดเองไปยัง แอปของตนได้ โฆษณาเหล่านี้แสดงด้วย NativeCustomFormatAd ออบเจ็กต์

โหลดรูปแบบโฆษณาเนทีฟที่กำหนดเอง

คู่มือนี้จะอธิบายวิธีโหลดและแสดงรูปแบบโฆษณาเนทีฟที่กำหนดเอง

สร้าง AdLoader

เช่นเดียวกับโฆษณาเนทีฟ รูปแบบโฆษณาเนทีฟที่กำหนดเองจะโหลดโดยใช้คลาส AdLoader ได้แก่

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 จะกําหนดค่า AdLoader เพื่อส่งคำขอที่กําหนดเอง และรูปแบบโฆษณาเนทีฟ มีพารามิเตอร์ 3 ตัวที่ส่งผ่านไปยังเมธอด ได้แก่

  • รหัสของรูปแบบโฆษณาเนทีฟที่กำหนดเองซึ่ง AdLoader ควรขอ ชิ้น รูปแบบโฆษณาเนทีฟที่กำหนดเองจะมีรหัสที่เชื่อมโยงอยู่ ช่วงเวลานี้ ระบุรูปแบบที่แอปต้องการให้ AdLoader ขอ
  • CANNOT TRANSLATE OnCustomFormatAdLoadedListener จะถูกเรียกใช้เมื่อโฆษณาโหลดสำเร็จแล้ว
  • ตัวเลือกเพิ่มเติม OnCustomClickListener เรียกใช้เมื่อผู้ใช้แตะหรือคลิกที่โฆษณา หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ Listener โปรดดูที่ส่วน "การจัดการคลิกและการแสดงผล" ด้านล่าง

เนื่องจากระบบสามารถตั้งค่าหน่วยโฆษณา 1 หน่วยให้แสดงครีเอทีฟโฆษณามากกว่า 1 รายการได้ รูปแบบ forCustomFormatAd อาจเรียกได้หลายครั้งโดยใช้ รหัสรูปแบบเพื่อเตรียมตัวโหลดโฆษณาให้ครอบคลุมโฆษณาได้มากกว่า 1 รายการ รูปแบบโฆษณาเนทีฟที่กำหนดเอง

รหัสรูปแบบโฆษณาเนทีฟที่กำหนดเอง

รหัสรูปแบบที่ใช้ระบุรูปแบบโฆษณาเนทีฟที่กำหนดเองสามารถ ใน UI ของ Ad Manager ในส่วนโฆษณาเนทีฟภายในการแสดงโฆษณา แบบเลื่อนลง:

รหัสรูปแบบโฆษณาเนทีฟที่กำหนดเองแต่ละรายการจะปรากฏอยู่ด้านข้างชื่อ คลิกที่หนึ่งใน จะนำคุณไปยังหน้าจอรายละเอียดที่แสดงข้อมูลเกี่ยวกับ ฟิลด์:

คุณจะเพิ่ม แก้ไข และนำช่องแต่ละช่องออกได้ โปรดทราบ ชื่อของแต่ละเนื้อหา ชื่อเป็นคีย์ที่ใช้ในการรับข้อมูลสำหรับ แต่ละเนื้อหา เมื่อแสดงรูปแบบโฆษณาเนทีฟที่กำหนดเอง

รูปแบบโฆษณาเนทีฟที่กำหนดเองในเครือข่ายดิสเพลย์

รูปแบบโฆษณาเนทีฟที่กำหนดเองแตกต่างจากรูปแบบที่ระบบกำหนดตรงที่ผู้เผยแพร่โฆษณา มีอำนาจในการกำหนดรายการเนื้อหาของตนเอง โฆษณา ดังนั้น กระบวนการแสดงโฆษณาจึงแตกต่างจากที่ระบบกำหนด รูปแบบต่างๆ ดังนี้

  1. เนื่องจากชั้นเรียน NativeCustomFormatAd มีไว้เพื่อจัดการ รูปแบบโฆษณาเนทีฟที่กำหนดเองที่คุณระบุใน Ad Manager แต่ไม่ได้ตั้งชื่อ "getters" สำหรับเนื้อหา แต่จะเสนอเมธอด เช่น getText และ getImage ที่นำชื่อช่องเป็นพารามิเตอร์
  2. ไม่มีคลาสการดูโฆษณาโดยเฉพาะ เช่น NativeAdView ที่จะใช้กับ NativeCustomFormatAd คุณสามารถใช้เลย์เอาต์ใดก็ได้ที่ คำนึงถึงประสบการณ์ของผู้ใช้
  3. ไม่มีชั้นเรียน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 พยายามตามลำดับต่อไปนี้

  1. เรียกใช้ OnCustomClickListener จาก AdLoader หากมี
  2. สำหรับ URL ของ Deep Link ของโฆษณาแต่ละรายการ ให้ลองค้นหารีโซลเวอร์เนื้อหา แล้วเริ่มรายการแรกที่แก้ปัญหาได้
  3. เปิดเบราว์เซอร์และไปที่ URL ปลายทางเดิมของโฆษณา

เมธอด forCustomFormatAd ยอมรับ OnCustomClickListener หากคุณ ส่งออบเจ็กต์ Listener เข้ามา SDK จะเรียกเมธอด onCustomClick แทน และไม่ต้องดำเนินการใดๆ เพิ่มเติม อย่างไรก็ตาม หากคุณส่งค่า Null ในฐานะผู้ Listener SDK จะกลับไปที่ Deep Link และ/หรือ URL ปลายทางที่ลงทะเบียนไว้กับ โฆษณาของคุณ

Listener การคลิกที่กำหนดเองช่วยให้แอปของคุณตัดสินใจเลือกการดำเนินการที่ดีที่สุดได้ การตอบสนองต่อการคลิก ไม่ว่าจะเป็นการอัปเดต UI, การเปิดตัวกิจกรรมใหม่ หรือ เป็นเพียงการบันทึกการคลิกเท่านั้น นี่คือตัวอย่าง ที่บันทึกว่าการคลิกเกิดขึ้น สถานที่:

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()

ในตอนแรกก็อาจฟังดูแปลกๆ ที่มี Listener คลิกที่กำหนดเองอยู่ ทั้งนี้ก็เพราะ แอปของคุณเพิ่งบอก SDK ว่ามีการคลิกเกิดขึ้น แล้วทำไม SDK จึงควรเปลี่ยน และรายงานข้อมูลดังกล่าวกับแอปได้ไหม

โฟลว์ข้อมูลนี้มีประโยชน์ด้วยเหตุผล 2-3 ประการ แต่ที่สำคัญที่สุดคือ ช่วยให้ SDK ยังคงควบคุมการตอบสนองต่อการคลิกได้ ช่วย ใช้คำสั่ง ping โดยอัตโนมัติกับ URL ติดตามผลของบุคคลที่สามซึ่งตั้งค่าไว้สำหรับ ครีเอทีฟโฆษณา รวมถึงจัดการงานอื่นๆ ในเบื้องหลังได้ รหัสเพิ่มเติม