เหตุการณ์ที่กำหนดเองของโฆษณาเนทีฟ

ข้อกำหนดเบื้องต้น

ทําการตั้งค่าเหตุการณ์ที่กําหนดเองให้เสร็จสมบูรณ์

ขอโฆษณาเนทีฟ

เมื่อถึงรายการโฆษณาเหตุการณ์ที่กำหนดเองในห่วงโซ่การแสดงโฆษณาสื่อกลางตามลำดับขั้น ระบบจะเรียกใช้เมธอด loadNativeAd() ในชื่อคลาสที่คุณระบุเมื่อสร้างเหตุการณ์ที่กำหนดเอง ในกรณีนี้ เมธอดดังกล่าวอยู่ใน SampleCustomEvent ซึ่งจะเรียกใช้ เมธอด loadNativeAd() ใน SampleNativeCustomEventLoader

หากต้องการขอโฆษณาเนทีฟ ให้สร้างหรือแก้ไขคลาสที่ขยาย Adapter เพื่อ ใช้ loadNativeAd() หากมีคลาสที่ขยาย Adapter อยู่แล้ว ให้ใช้ loadNativeAd() ในคลาสนั้น นอกจากนี้ ให้สร้างชั้นเรียนใหม่เพื่อใช้ UnifiedNativeAdMapper

ในตัวอย่างเหตุการณ์ที่กําหนดเอง SampleCustomEvent จะขยายคลาส Adapter แล้วมอบสิทธิ์ให้ SampleNativeCustomEventLoader

Java

package com.google.ads.mediation.sample.customevent;

import com.google.android.gms.ads.mediation.Adapter;
import com.google.android.gms.ads.mediation.MediationAdConfiguration;
import com.google.android.gms.ads.mediation.MediationAdLoadCallback;

import com.google.android.gms.ads.mediation.MediationNativeAdCallback;
...
public class SampleCustomEvent extends Adapter {
  private SampleNativeCustomEventLoader nativeLoader;

  @Override
  public void loadNativeAd(
      @NonNull MediationNativeAdConfiguration adConfiguration,
      @NonNull MediationAdLoadCallback<UnifiedNativeAdMapper, MediationNativeAdCallback> callback) {
    nativeLoader = new SampleNativeCustomEventLoader(adConfiguration, callback);
    nativeLoader.loadAd();
  }
}

SampleNativeCustomEventLoader มีหน้าที่รับผิดชอบงานต่อไปนี้

  • กำลังโหลดโฆษณาเนทีฟ

  • การนำUnifiedNativeAdMapperชั้นเรียนไปใช้

  • รับและรายงานการเรียกกลับของเหตุการณ์โฆษณาไปยัง SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google

พารามิเตอร์ที่ไม่บังคับที่กำหนดไว้ใน UI ของ AdMob จะรวมอยู่ในการกำหนดค่าโฆษณา เข้าถึงพารามิเตอร์ได้ผ่าน adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD) โดยปกติแล้วพารามิเตอร์นี้คือตัวระบุหน่วยโฆษณาที่ SDK เครือข่ายโฆษณา กำหนดเมื่อสร้างออบเจ็กต์โฆษณา

Java

package com.google.ads.mediation.sample.customevent;

import com.google.android.gms.ads.mediation.Adapter;
import com.google.android.gms.ads.mediation.MediationNativeAdConfiguration;
import com.google.android.gms.ads.mediation.MediationAdLoadCallback;
import com.google.android.gms.ads.mediation.MediationNativeAdCallback;
...

public class SampleNativeCustomEventLoader extends SampleNativeAdListener {
  /** Configuration for requesting the native ad from the third-party network. */
  private final MediationNativeAdConfiguration mediationNativeAdConfiguration;

  /** Callback that fires on loading success or failure. */
  private final MediationAdLoadCallback<UnifiedNativeAdMapper, MediationNativeAdCallback>
      mediationAdLoadCallback;

  /** Callback for native ad events. */
  private MediationNativeAdCallback nativeAdCallback;

  /** Constructor */
  public SampleNativeCustomEventLoader(
      @NonNull MediationNativeAdConfiguration mediationNativeAdConfiguration,
      @NonNull MediationAdLoadCallback<MediationNativeAd, MediationNativeAdCallback>
              mediationAdLoadCallback) {
    this.mediationNativeAdConfiguration = mediationNativeAdConfiguration;
    this.mediationAdLoadCallback = mediationAdLoadCallback;
  }

  /** Loads the native ad from the third-party ad network. */
  public void loadAd() {
    // Create one of the Sample SDK's ad loaders to request ads.
    Log.i("NativeCustomEvent", "Begin loading native ad.");
    SampleNativeAdLoader loader =
        new SampleNativeAdLoader(mediationNativeAdConfiguration.getContext());

    // All custom events have a server parameter named "parameter" that returns
    // back the parameter entered into the UI when defining the custom event.
    String serverParameter = mediationNativeAdConfiguration
        .getServerParameters()
        .getString(MediationConfiguration
        .CUSTOM_EVENT_SERVER_PARAMETER_FIELD);
    Log.d("NativeCustomEvent", "Received server parameter.");

    loader.setAdUnit(serverParameter);

    // Create a native request to give to the SampleNativeAdLoader.
    SampleNativeAdRequest request = new SampleNativeAdRequest();
    NativeAdOptions options = mediationNativeAdConfiguration.getNativeAdOptions();
    if (options != null) {
      // If the NativeAdOptions' shouldReturnUrlsForImageAssets is true, the adapter should
      // send just the URLs for the images.
      request.setShouldDownloadImages(!options.shouldReturnUrlsForImageAssets());

      request.setShouldDownloadMultipleImages(options.shouldRequestMultipleImages());
      switch (options.getMediaAspectRatio()) {
        case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_LANDSCAPE:
          request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_LANDSCAPE);
          break;
        case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_PORTRAIT:
          request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_PORTRAIT);
          break;
        case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_SQUARE:
        case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_ANY:
        case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_UNKNOWN:
        default:
          request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_ANY);
      }
    }

    loader.setNativeAdListener(this);

    // Begin a request.
    Log.i("NativeCustomEvent", "Start fetching native ad.");
    loader.fetchAd(request);
  }
}

คุณจะเรียกใช้ onSuccess() หรือ onFailure() ขึ้นอยู่กับว่าดึงข้อมูลโฆษณาสำเร็จหรือไม่ หรือพบข้อผิดพลาด onSuccess() จะเรียกใช้โดยส่งอินสแตนซ์ของคลาสที่ใช้ MediationNativeAd

โดยปกติแล้ว วิธีการเหล่านี้จะได้รับการติดตั้งใช้งานภายในโค้ดเรียกกลับจาก SDK ของบุคคลที่สามที่อะแดปเตอร์ของคุณติดตั้งใช้งาน ในตัวอย่างนี้ SDK ตัวอย่าง มี SampleAdListener พร้อม Callback ที่เกี่ยวข้องดังนี้

Java

@Override
public void onNativeAdFetched(SampleNativeAd ad) {
  SampleUnifiedNativeAdMapper mapper = new SampleUnifiedNativeAdMapper(ad);
  mediationNativeAdCallback = mediationAdLoadCallback.onSuccess(mapper);
}

@Override
public void onAdFetchFailed(SampleErrorCode errorCode) {
  mediationAdLoadCallback.onFailure(SampleCustomEventError.createSampleSdkError(errorCode));
}

โฆษณาเนทีฟบนแผนที่

SDK แต่ละรายการมีรูปแบบเฉพาะของโฆษณาเนทีฟ โดยอาจมีออบเจ็กต์ที่ประกอบด้วยฟิลด์ "title" เช่น ขณะที่อีกออบเจ็กต์อาจมี "headline" นอกจากนี้ วิธีการที่ใช้ในการติดตามการแสดงผลและประมวลผล การคลิกอาจแตกต่างกันไปในแต่ละ SDK

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

Java

package com.google.ads.mediation.sample.customevent;

import com.google.android.gms.ads.mediation.UnifiedNativeAdMapper;
import com.google.android.gms.ads.nativead.NativeAd;
...

public class SampleUnifiedNativeAdMapper extends UnifiedNativeAdMapper {

  private final SampleNativeAd sampleAd;

  public SampleUnifiedNativeAdMapper(SampleNativeAd ad) {
    sampleAd = ad;
    setHeadline(sampleAd.getHeadline());
    setBody(sampleAd.getBody());
    setCallToAction(sampleAd.getCallToAction());
    setStarRating(sampleAd.getStarRating());
    setStore(sampleAd.getStoreName());
    setIcon(
        new SampleNativeMappedImage(
            ad.getIcon(), ad.getIconUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));
    setAdvertiser(ad.getAdvertiser());

    List<NativeAd.Image> imagesList = new ArrayList<NativeAd.Image>();
    imagesList.add(new SampleNativeMappedImage(ad.getImage(), ad.getImageUri(),
        SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));
    setImages(imagesList);

    if (sampleAd.getPrice() != null) {
      NumberFormat formatter = NumberFormat.getCurrencyInstance();
      String priceString = formatter.format(sampleAd.getPrice());
      setPrice(priceString);
    }

    Bundle extras = new Bundle();
    extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness());
    this.setExtras(extras);

    setOverrideClickHandling(false);
    setOverrideImpressionRecording(false);

    setAdChoicesContent(sampleAd.getInformationIcon());
  }

  @Override
  public void recordImpression() {
    sampleAd.recordImpression();
  }

  @Override
  public void handleClick(View view) {
    sampleAd.handleClick(view);
  }

  // The Sample SDK doesn't do its own impression/click tracking, instead relies on its
  // publishers calling the recordImpression and handleClick methods on its native ad object. So
  // there's no need to pass a reference to the View being used to display the native ad. If
  // your mediated network does need a reference to the view, the following method can be used
  // to provide one.

  @Override
  public void trackViews(View containerView, Map<String, View> clickableAssetViews,
      Map<String, View> nonClickableAssetViews) {
    super.trackViews(containerView, clickableAssetViews, nonClickableAssetViews);
    // If your ad network SDK does its own impression tracking, here is where you can track the
    // top level native ad view and its individual asset views.
  }

  @Override
  public void untrackView(View view) {
    super.untrackView(view);
    // Here you would remove any trackers from the View added in trackView.
  }
}

ตอนนี้เรามาดูโค้ดของตัวสร้างอย่างละเอียดกัน

เก็บการอ้างอิงออบเจ็กต์โฆษณาเนทีฟที่ใช้สื่อกลาง

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

ตั้งค่าพร็อพเพอร์ตี้ของชิ้นงานที่แมป

ตัวสร้างใช้ออบเจ็กต์ SampleNativeAd เพื่อป้อนข้อมูลชิ้นงานใน UnifiedNativeAdMapper

ข้อมูลโค้ดนี้จะรับข้อมูลราคาของโฆษณาที่ไกล่เกลี่ยและใช้เพื่อตั้งค่าราคาของ Mapper price:

Java

if (sampleAd.getPrice() != null) {
    NumberFormat formatter = NumberFormat.getCurrencyInstance();
    String priceString = formatter.format(sampleAd.getPrice());
    setPrice(priceString);
}

ในตัวอย่างนี้ โฆษณาที่ใช้สื่อกลางจะจัดเก็บราคาเป็น double ขณะที่ AdMob จะใช้ String สำหรับชิ้นงานเดียวกัน Mapper มีหน้าที่จัดการ Conversion ประเภทนี้

ชิ้นงานรูปภาพแผนที่

การแมปชิ้นงานรูปภาพมีความซับซ้อนมากกว่าการแมปประเภทข้อมูล เช่น double หรือ String ระบบอาจดาวน์โหลดรูปภาพโดยอัตโนมัติหรือ แสดงเป็นค่า URL นอกจากนี้ สเกลพิกเซลต่อ DPI ยังอาจแตกต่างกันด้วย

Google Mobile Ads SDK มีคลาส NativeAd.Image เพื่อช่วยคุณจัดการรายละเอียดเหล่านี้ ในลักษณะเดียวกับที่คุณต้องสร้างคลาสย่อยของ UnifiedNativeAdMapper เพื่อแมปโฆษณาเนทีฟที่สื่อกลาง คุณควรสร้างคลาสย่อยของ NativeAd.Image เมื่อแมปชิ้นงานรูปภาพด้วย

ตัวอย่างสำหรับคลาส SampleNativeMappedImage ของเหตุการณ์ที่กำหนดเอง

Java

public class SampleNativeMappedImage extends NativeAd.Image {

  private Drawable drawable;
  private Uri imageUri;
  private double scale;

  public SampleNativeMappedImage(Drawable drawable, Uri imageUri, double scale) {
    this.drawable = drawable;
    this.imageUri = imageUri;
    this.scale = scale;
  }

  @Override
  public Drawable getDrawable() {
    return drawable;
  }

  @Override
  public Uri getUri() {
    return imageUri;
  }

  @Override
  public double getScale() {
    return scale;
  }
}

SampleNativeAdMapper ใช้คลาสรูปภาพที่แมปในบรรทัดนี้เพื่อตั้งค่าชิ้นงานรูปภาพไอคอนของ Mapper ดังนี้

Java

setIcon(new SampleNativeMappedImage(ad.getAppIcon(), ad.getAppIconUri(),
    SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));

เพิ่มช่องลงในแพ็กเกจเสริม

SDK สื่อกลางบางรายการมีชิ้นงานเพิ่มเติมนอกเหนือจากชิ้นงานใน รูปแบบโฆษณาเนทีฟของ AdMob UnifiedNativeAdMapper คลาสมีเมธอด setExtras() ที่ใช้เพื่อส่งเนื้อหาเหล่านี้ไปยัง ผู้เผยแพร่โฆษณา SampleNativeAdMapper ใช้ค่านี้สำหรับชิ้นงาน "ระดับความยอดเยี่ยม" ของ Sample SDK ดังนี้

Java

Bundle extras = new Bundle();
extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness());
this.setExtras(extras);

ผู้เผยแพร่โฆษณาสามารถดึงข้อมูลได้โดยใช้เมธอด getExtras() ของNativeAdคลาสgetExtras()

ตัวเลือกโฆษณาอื่นๆ

เหตุการณ์ที่กําหนดเองของคุณมีหน้าที่รับผิดชอบในการแสดงไอคอนตัวเลือกโฆษณาอื่นๆ โดยใช้เมธอด setAdChoicesContent() ใน UnifiedNativeAdMapper ต่อไปนี้คือข้อมูลโค้ดจาก SampleNativeAdMapper ที่แสดงวิธีระบุไอคอนตัวเลือกโฆษณาอื่นๆ

Java

public SampleNativeAdMapper(SampleNativeAd ad) {
    ...
    setAdChoicesContent(sampleAd.getInformationIcon());
}

เหตุการณ์การแสดงผลและการคลิก

ทั้ง SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google และ SDK ที่ใช้สื่อกลางต้องทราบเมื่อเกิดการแสดงผลหรือคลิก แต่มีเพียง SDK เดียวเท่านั้นที่ต้องติดตามเหตุการณ์เหล่านี้ เหตุการณ์ที่กําหนดเองใช้ได้ 2 วิธีที่แตกต่างกัน ขึ้นอยู่กับว่า SDK สื่อกลางรองรับการติดตามการแสดงผลและการคลิกด้วยตัวเองหรือไม่

ติดตามการคลิกและการแสดงผลด้วย SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google

หาก SDK ที่ใช้สื่อกลางไม่ได้ติดตามการแสดงผลและการคลิกของตัวเอง แต่ มีเมธอดสำหรับบันทึกการคลิกและการแสดงผล Google Mobile Ads SDK จะ ติดตามเหตุการณ์เหล่านี้และแจ้งอะแดปเตอร์ได้ คลาส UnifiedNativeAdMapper มี 2 เมธอด ได้แก่ recordImpression() และ handleClick() ซึ่ง เหตุการณ์ที่กำหนดเองสามารถใช้เพื่อเรียกเมธอดที่เกี่ยวข้องในออบเจ็กต์โฆษณาเนทีฟที่สื่อกลาง ได้

Java

@Override
public void recordImpression() {
  sampleAd.recordImpression();
}

@Override
public void handleClick(View view) {
  sampleAd.handleClick(view);
}

เนื่องจาก SampleNativeAdMapper มีการอ้างอิงไปยังออบเจ็กต์โฆษณาเนทีฟของ SDK ตัวอย่าง จึงเรียกใช้เมธอดที่เหมาะสมในออบเจ็กต์นั้นเพื่อรายงานการคลิก หรือการแสดงผลได้ โปรดทราบว่าเมธอด handleClick() รับพารามิเตอร์เดียวคือออบเจ็กต์ View ที่สอดคล้องกับชิ้นงานโฆษณาเนทีฟที่ได้รับการคลิก

ติดตามคลิกและการแสดงผลด้วย SDK ที่ใช้สื่อกลาง

SDK ที่ใช้สื่อกลางบางรายการอาจต้องการติดตามการคลิกและการแสดงผลด้วยตนเอง ในกรณีนี้ คุณควรลบล้างการติดตามคลิกและการแสดงผลเริ่มต้นโดย ทำการเรียก 2 ครั้งต่อไปนี้ในเครื่องมือสร้างของ UnifiedNativeAdMapper

Java

setOverrideClickHandling(true);
setOverrideImpressionRecording(true);

ต้องมีเหตุการณ์ที่กําหนดเองซึ่งลบล้างการติดตามคลิกและการแสดงผลเพื่อรายงานเหตุการณ์ onAdClicked() และ onAdImpression() ไปยัง SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google

หากต้องการติดตามการแสดงผลและการคลิก SDK สื่อกลางอาจต้องเข้าถึง มุมมองเพื่อเปิดใช้การติดตาม เหตุการณ์ที่กำหนดเองควรลบล้างเมธอด trackViews()และใช้เพื่อส่งมุมมองของโฆษณาเนทีฟไปยัง SDK ที่ทําการไกล่เกลี่ย เพื่อติดตาม SDK ตัวอย่างจากโปรเจ็กต์ตัวอย่างเหตุการณ์ที่กําหนดเอง (ซึ่งเรานําข้อมูลโค้ดในคําแนะนํานี้มา) ไม่ได้ใช้วิธีนี้ แต่หากใช้ โค้ดเหตุการณ์ที่กําหนดเองจะมีลักษณะดังนี้

Java

@Override
public void trackViews(View containerView,
    Map<String, View> clickableAssetViews,
    Map<String, View> nonClickableAssetViews) {
  sampleAd.setNativeAdViewForTracking(containerView);
}

หาก SDK สื่อกลางรองรับการติดตามชิ้นงานแต่ละรายการ ก็จะดูภายใน clickableAssetViews เพื่อดูว่าควรทำให้มุมมองใดคลิกได้ แผนที่นี้ มีคีย์เป็นชื่อชิ้นงานใน NativeAdAssetNames UnifiedNativeAdMapper มีเมธอด untrackView() ที่สอดคล้องกันซึ่งเหตุการณ์ที่กำหนดเองสามารถลบล้าง เพื่อปล่อยการอ้างอิงใดๆ ไปยังมุมมองและยกเลิกการเชื่อมโยงกับออบเจ็กต์โฆษณาเนทีฟ

ส่งต่อเหตุการณ์สื่อกลางไปยัง SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google

ดูการเรียกกลับทั้งหมดที่สื่อกลางรองรับได้ในเอกสารMediationNativeAdCallback

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

เพียงเท่านี้ก็ใช้งานเหตุการณ์ที่กำหนดเองสำหรับโฆษณาเนทีฟเสร็จเรียบร้อย ดูตัวอย่างฉบับเต็มได้ที่ GitHub