नेटिव विज्ञापनों के कस्टम इवेंट

प्लैटफ़ॉर्म चुनें: Android iOS Android (लेगसी)

ज़रूरी शर्तें

कस्टम इवेंट सेटअप पूरा करें.

नेटिव विज्ञापन दिखाने का अनुरोध करना

जब वॉटरफ़ॉल मीडिएशन चेन में कस्टम इवेंट लाइन आइटम तक पहुंचा जाता है, तब loadNativeAd() तरीके को उस क्लास के नाम पर कॉल किया जाता है जो आपने कस्टम इवेंट बनाते समय दिया था. इस मामले में, वह तरीका SampleCustomEvent में है. इसके बाद, यह SampleNativeCustomEventLoader में loadNativeAd() तरीके को कॉल करता है.

नेटिव विज्ञापन का अनुरोध करने के लिए, ऐसी क्लास बनाएं या उसमें बदलाव करें जो loadNativeAd() को लागू करने के लिए Adapter को एक्सटेंड करती हो. अगर 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 क्लास को लागू करना.

  • Google Mobile Ads SDK (Legacy) को विज्ञापन इवेंट के कॉलबैक मिलना और उनकी रिपोर्ट करना.

AdMob के यूज़र इंटरफ़ेस (यूआई) में तय किया गया वैकल्पिक पैरामीटर, विज्ञापन कॉन्फ़िगरेशन में शामिल होता है. पैरामीटर को adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD) के ज़रिए ऐक्सेस किया जा सकता है. आम तौर पर, यह पैरामीटर एक विज्ञापन यूनिट आइडेंटिफ़ायर होता है. विज्ञापन ऑब्जेक्ट को इंस्टैंशिएट करते समय, विज्ञापन नेटवर्क कंपनी के एसडीके को इसकी ज़रूरत होती है.

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 को लागू करने वाली क्लास का इंस्टेंस पास किया जाता है.

आम तौर पर, ये तरीके तीसरे पक्ष के उस एसडीके से कॉलबैक के अंदर लागू किए जाते हैं जिसे आपका अडैप्टर लागू करता है. इस उदाहरण के लिए, Sample SDK में काम के कॉलबैक के साथ SampleAdListener है:

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 टूल के पास नेटिव विज्ञापनों के लिए अपने यूनीक फ़ॉर्मैट होते हैं. उदाहरण के लिए, एक ऑब्जेक्ट में "टाइटल" फ़ील्ड हो सकता है, जबकि दूसरे में "हेडलाइन" हो सकता है. इसके अलावा, इंप्रेशन ट्रैक करने और क्लिक प्रोसेस करने के लिए इस्तेमाल किए जाने वाले तरीके, एक एसडीके से दूसरे एसडीके में अलग-अलग हो सकते हैं.

UnifiedNativeAdMapper इन अंतरों को दूर करने और मीडिएशन वाले SDK के नेटिव विज्ञापन ऑब्जेक्ट को अडैप्ट करने के लिए ज़िम्मेदार है, ताकि वह Google Mobile Ads SDK (Legacy) के लिए ज़रूरी इंटरफ़ेस से मैच कर सके. कस्टम इवेंट को इस क्लास को एक्सटेंड करना चाहिए, ताकि वे मीडिएशन वाले 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 पैरामीटर को स्वीकार करता है. यह नेटिव विज्ञापन क्लास है, जिसका इस्तेमाल सैंपल एसडीके अपने नेटिव विज्ञापनों के लिए करता है. मैपर को मीडिएट किए गए विज्ञापन के रेफ़रंस की ज़रूरत होती है, ताकि वह क्लिक और इंप्रेशन इवेंट को पास कर सके. SampleNativeAd को लोकल वैरिएबल के तौर पर सेव किया गया है.

मैप की गई ऐसेट की प्रॉपर्टी सेट करना

कंस्ट्रक्टर, UnifiedNativeAdMapper में ऐसेट को पॉप्युलेट करने के लिए, SampleNativeAd ऑब्जेक्ट का इस्तेमाल करता है.

यह स्निपेट, मीडिएट किए गए विज्ञापन की कीमत का डेटा लेता है और उसका इस्तेमाल करके, मैपर की कीमत सेट करता है:

Java

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

इस उदाहरण में, मीडिएट किया गया विज्ञापन, कीमत को double के तौर पर सेव करता है. वहीं, AdMob उसी ऐसेट के लिए String का इस्तेमाल करता है. इस तरह के कन्वर्ज़न को मैनेज करने की ज़िम्मेदारी मैपर की होती है.

मैप इमेज ऐसेट

इमेज ऐसेट को मैप करना, double या String जैसे डेटा टाइप को मैप करने से ज़्यादा मुश्किल है. इमेज अपने-आप डाउनलोड हो सकती हैं या यूआरएल वैल्यू के तौर पर दिख सकती हैं. इनके पिक्सल-टू-डीपीआई स्केल भी अलग-अलग हो सकते हैं.

इन जानकारी को मैनेज करने में आपकी मदद करने के लिए, Google Mobile Ads SDK (Legacy), 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, इस लाइन में मैप की गई इमेज क्लास का इस्तेमाल करके, मैपर के आइकॉन की इमेज ऐसेट सेट करता है:

Java

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

अतिरिक्त बंडल में फ़ील्ड जोड़ना

मीडिएशन वाले कुछ SDK टूल, AdMob नेटिव विज्ञापन फ़ॉर्मैट में मौजूद एसेट के अलावा, अन्य एसेट भी उपलब्ध कराते हैं. UnifiedNativeAdMapper क्लास में setExtras() तरीका शामिल होता है. इसका इस्तेमाल, इन ऐसेट को पब्लिशर को पास करने के लिए किया जाता है. SampleNativeAdMapper, सैंपल एसडीके की "degree of awesomeness" एसेट के लिए इसका इस्तेमाल करता है:

Java

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

पब्लिशर, NativeAd क्लास के getExtras() तरीके का इस्तेमाल करके डेटा हासिल कर सकते हैं.

AdChoices

UnifiedNativeAdMapper पर setAdChoicesContent() तरीके का इस्तेमाल करके, AdChoices आइकॉन उपलब्ध कराने की ज़िम्मेदारी आपके कस्टम इवेंट की है. यहां SampleNativeAdMapper का एक स्निपेट दिया गया है, जिसमें AdChoices आइकॉन उपलब्ध कराने का तरीका बताया गया है:

Java

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

इंप्रेशन और क्लिक इवेंट

Google Mobile Ads SDK (Legacy) और मीडिएट किए गए SDK टूल, दोनों को यह पता होना चाहिए कि इंप्रेशन या क्लिक कब होता है. हालांकि, इन इवेंट को ट्रैक करने की ज़रूरत सिर्फ़ एक SDK टूल को होती है. कस्टम इवेंट के लिए दो अलग-अलग तरीके इस्तेमाल किए जा सकते हैं. यह इस बात पर निर्भर करता है कि मीडिएशन वाला SDK टूल, इंप्रेशन और क्लिक को खुद ट्रैक कर सकता है या नहीं.

Google Mobile Ads SDK (Legacy) की मदद से क्लिक और इंप्रेशन ट्रैक करना

अगर मीडिएशन वाला SDK टूल, इंप्रेशन और क्लिक को खुद ट्रैक नहीं करता, लेकिन क्लिक और इंप्रेशन रिकॉर्ड करने के तरीके उपलब्ध कराता है, तो Google Mobile Ads SDK (Legacy) इन इवेंट को ट्रैक कर सकता है और अडैप्टर को इसकी सूचना दे सकता है. UnifiedNativeAdMapper क्लास में दो तरीके शामिल हैं: recordImpression() और handleClick(). कस्टम इवेंट, मीडिएशन वाले नेटिव विज्ञापन ऑब्जेक्ट पर, उससे जुड़े तरीके को कॉल करने के लिए इन्हें लागू कर सकते हैं:

Java

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

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

SampleNativeAdMapper में सैंपल SDK टूल के नेटिव विज्ञापन ऑब्जेक्ट का रेफ़रंस होता है. इसलिए, यह क्लिक या इंप्रेशन की रिपोर्ट करने के लिए, उस ऑब्जेक्ट पर सही तरीके को कॉल कर सकता है. ध्यान दें कि handleClick() वाला तरीका, सिर्फ़ एक पैरामीटर लेता है: क्लिक पाने वाली नेटिव विज्ञापन ऐसेट से जुड़ा View ऑब्जेक्ट.

मीडिएशन वाले एसडीके की मदद से क्लिक और इंप्रेशन ट्रैक करना

कुछ मीडिएटेड एसडीके, क्लिक और इंप्रेशन को खुद ट्रैक करना पसंद कर सकते हैं. ऐसे में, आपको अपने UnifiedNativeAdMapper के कंस्ट्रक्टर में ये दो कॉल करके, डिफ़ॉल्ट क्लिक और इंप्रेशन ट्रैकिंग को बदलना चाहिए:

Java

setOverrideClickHandling(true);
setOverrideImpressionRecording(true);

क्लिक और इंप्रेशन ट्रैकिंग को बदलने वाले कस्टम इवेंट, Google Mobile Ads SDK को onAdClicked() और onAdImpression() इवेंट की रिपोर्ट करने के लिए ज़रूरी हैं.

इंप्रेशन और क्लिक को ट्रैक करने के लिए, मीडिएटेड एसडीके को व्यू का ऐक्सेस चाहिए होगा. कस्टम इवेंट को trackViews() तरीके को बदलना चाहिए. साथ ही, इसका इस्तेमाल करके नेटिव विज्ञापन के व्यू को मीडिएट किए गए SDK टूल को पास करना चाहिए, ताकि उसे ट्रैक किया जा सके. कस्टम इवेंट के उदाहरण वाले हमारे प्रोजेक्ट (जिससे इस गाइड के कोड स्निपेट लिए गए हैं) का सैंपल SDK टूल, इस तरीके का इस्तेमाल नहीं करता. हालांकि, अगर ऐसा होता, तो कस्टम इवेंट का कोड कुछ ऐसा दिखता:

Java

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

अगर मीडिएटेड एसडीके, अलग-अलग ऐसेट को ट्रैक करने की सुविधा देता है, तो वह clickableAssetViews में जाकर देख सकता है कि किन व्यू को क्लिक करने लायक बनाया जाना चाहिए. इस मैप को NativeAdAssetNames में ऐसेट के नाम से की-कोड किया गया है. UnifiedNativeAdMapper, untrackView() का एक तरीका उपलब्ध कराता है. कस्टम इवेंट, व्यू के किसी भी रेफ़रंस को रिलीज़ करने और उसे नेटिव विज्ञापन ऑब्जेक्ट से अलग करने के लिए, इस तरीके को बदल सकते हैं.

मीडिएशन इवेंट को Google Mobile Ads SDK (Legacy) पर फ़ॉरवर्ड करें

MediationNativeAdCallback दस्तावेज़ में, मीडिएशन के साथ काम करने वाले सभी कॉलबैक देखे जा सकते हैं.

यह ज़रूरी है कि आपका कस्टम इवेंट, इनमें से ज़्यादा से ज़्यादा कॉलबैक को फ़ॉरवर्ड करे, ताकि आपके ऐप्लिकेशन को Google Mobile Ads SDK (Legacy) से ये मिलते-जुलते इवेंट मिल सकें. यहां कॉलबैक इस्तेमाल करने का एक उदाहरण दिया गया है:

इससे नेटिव विज्ञापनों के लिए, कस्टम इवेंट लागू करने की प्रोसेस पूरी हो जाती है. पूरा उदाहरण GitHub पर उपलब्ध है.