নেটিভ বিজ্ঞাপন কাস্টম ইভেন্ট

প্ল্যাটফর্ম বেছে নিন: Android iOS Android (Legacy)

পূর্বশর্ত

কাস্টম ইভেন্ট সেট-আপ সম্পূর্ণ করুন।

নেটিভ বিজ্ঞাপনের অনুরোধ করা

ওয়াটারফল মধ্যস্থতা চেনে কাস্টম ইভেন্ট লাইন আইটেমে পৌঁছালে, কাস্টম ইভেন্ট তৈরি করার সময় আপনি যে ক্লাস নেম দিয়েছেন, সেটিতে loadNativeAd() মেথড কল করা হয়। এই ক্ষেত্রে, সেই পদ্ধতিটি SampleCustomEvent-এ আছে, যা তারপরে SampleNativeCustomEventLoader-এ loadNativeAd() পদ্ধতিকে কল করে।

নেটিভ বিজ্ঞাপন অনুরোধ করতে, 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 ক্লাস প্রয়োগ করা।

  • GMA Next-Gen SDK-এ বিজ্ঞাপন ইভেন্ট কলব্যাক পাওয়া ও রিপোর্ট করা।

Ad Manager UI-তে সংজ্ঞায়িত ঐচ্ছিক প্যারামিটারটি বিজ্ঞাপন কনফিগারেশনে অন্তর্ভুক্ত করা হয়েছে। প্যারামিটারটি 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 থেকে কলব্যাক ফাংশনের মধ্যে এইসব পদ্ধতি প্রয়োগ করা হয়। এই উদাহরণের জন্য, 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));
}

Map নেটিভ বিজ্ঞাপন

নেটিভ বিজ্ঞাপনের জন্য বিভিন্ন SDK-এর নিজস্ব অনন্য ফর্ম্যাট আছে। একটি কোয়েরি এমন অবজেক্ট রিটার্ন করতে পারে যাতে "শীর্ষক" ফিল্ড আছে, যেমন, অন্য একটি কোয়েরিতে "শিরোনাম" থাকতে পারে। এছাড়াও, ইম্প্রেশন ট্র্যাক করা এবং ক্লিক প্রসেস করার পদ্ধতি এক SDK থেকে অন্য SDK-তে আলাদা হতে পারে।

এইসব পার্থক্য মেটানো এবং GMA Next-Gen SDK-এর প্রত্যাশিত ইন্টারফেসের সাথে ম্যাচ করানোর জন্য মিডিয়েটেড SDK-এর নেটিভ বিজ্ঞাপন অবজেক্ট অ্যাডজাস্ট করার দায়িত্ব UnifiedNativeAdMapper-এর। কাস্টম ইভেন্টকে এই ক্লাস এক্সটেন্ড করে তাদের মধ্যস্থতা করা 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 প্যারামিটার গ্রহণ করে, এর নেটিভ বিজ্ঞাপনের জন্য Sample SDK-এর ব্যবহার করা নেটিভ বিজ্ঞাপন ক্লাস। ম্যাপারের কাছে মধ্যস্থতা করা বিজ্ঞাপনের রেফারেন্স থাকতে হবে, যাতে এটি ক্লিক ও ইম্প্রেশন ইভেন্ট পাস করতে পারে। SampleNativeAd একটি লোকাল ভেরিয়েবেল হিসেবে স্টোর করা হয়।

ম্যাপ করা অ্যাসেট প্রপার্টি সেট করা

কনস্ট্রাক্টর SampleNativeAd অবজেক্ট ব্যবহার করে UnifiedNativeAdMapper-এ অ্যাসেট পপুলেট করে।

এই স্নিপেট মধ্যস্থতা করা বিজ্ঞাপনের দাম সংক্রান্ত ডেটা পায় এবং এটি ব্যবহার করে ম্যাপারের দাম সেট করে:

Java

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

এই উদাহরণে, মধ্যস্থতাকারী বিজ্ঞাপনটি দামকে double হিসেবে সেভ করে, যেখানে Ad Manager একই অ্যাসেটের জন্য String ব্যবহার করে। এই ধরনের কনভার্সন ম্যানেজ করার দায়িত্ব ম্যাপারের।

ম্যাপের ছবি অ্যাসেট

double বা String-এর মতো ডেটা টাইপ ম্যাপ করার চেয়ে ইমেজ অ্যাসেট ম্যাপ করা অনেক বেশি জটিল। ছবি অটোমেটিক ডাউনলোড করা হতে পারে অথবা URL ভ্যালু হিসেবে রিটার্ন করা হতে পারে। তাদের পিক্সেল-টু-ডিপিআই স্কেলও আলাদা হতে পারে।

এইসব বিবরণ ম্যানেজ করতে সাহায্য করার জন্য, GMA Next-Gen 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 এই লাইনে এর ম্যাপ করা ইমেজ ক্লাস ব্যবহার করে ম্যাপারের আইকন ইমেজ অ্যাসেট সেট করে:

Java

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

'এক্সট্রা' বান্ডেলে ফিল্ড যোগ করা

কিছু মধ্যস্থতা করা SDK, Ad Manager নেটিভ বিজ্ঞাপন ফর্ম্যাটের অতিরিক্ত অ্যাসেট প্রদান করে। UnifiedNativeAdMapper ক্লাসে একটি setExtras() পদ্ধতি আছে যা প্রকাশকদের কাছে এইসব অ্যাসেট পাস করার জন্য ব্যবহার করা হয়। SampleNativeAdMapper Sample SDK-এর "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 আইকন প্রদান করার দায়িত্ব আপনার কাস্টম ইভেন্টের। AdChoices আইকন কীভাবে প্রদান করতে হয় তা SampleNativeAdMapper থেকে নেওয়া এই স্নিপেটে দেখানো হয়েছে:

Java

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

ইম্প্রেশন ও ক্লিক ইভেন্ট

GMA Next-Gen SDK এবং মধ্যস্থতা করা SDK, দু'টিকেই জানতে হবে যে কখন কোনও ইম্প্রেশন বা ক্লিক হয়েছে, কিন্তু শুধুমাত্র একটি SDK-কে এইসব ইভেন্ট ট্র্যাক করতে হবে। কাস্টম ইভেন্ট দুটি আলাদা আলাদা পদ্ধতি ব্যবহার করতে পারে। এটি নির্ভর করে যে মধ্যস্থতা করা SDK নিজে থেকেই ইম্প্রেশন ও ক্লিক ট্র্যাক করতে পারে কিনা।

GMA Next-Gen SDK-এর মাধ্যমে ক্লিক ও ইম্প্রেশন ট্র্যাক করা

যদি মধ্যস্থতা করা SDK নিজস্ব ইম্প্রেশন ও ক্লিক ট্র্যাকিং না করে, কিন্তু ক্লিক ও ইম্প্রেশন রেকর্ড করার পদ্ধতি প্রদান করে, তাহলে GMA Next-Gen SDK এই ইভেন্ট ট্র্যাক করতে এবং অ্যাডাপ্টারকে বিজ্ঞপ্তি পাঠাতে পারে। UnifiedNativeAdMapper ক্লাসে দুটি পদ্ধতি আছে: recordImpression() এবং handleClick() যেগুলি কাস্টম ইভেন্ট, মধ্যস্থতা করা নেটিভ বিজ্ঞাপন অবজেক্টে সংশ্লিষ্ট পদ্ধতি কল করার জন্য প্রয়োগ করতে পারে:

Java

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

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

কারণ, SampleNativeAdMapper-এ Sample SDK-এর নেটিভ বিজ্ঞাপন অবজেক্টের রেফারেন্স থাকে, তাই ক্লিক বা ইম্প্রেশন রিপোর্ট করার জন্য এটি সেই অবজেক্টে উপযুক্ত মেথড কল করতে পারে। মনে রাখবেন, handleClick() পদ্ধতিতে একটি সিঙ্গেল প্যারামিটার থাকে: নেটিভ বিজ্ঞাপন অ্যাসেটের সাথে সম্পর্কিত View অবজেক্ট যা ক্লিক পেয়েছে।

মধ্যস্থতা করা SDK-এর মাধ্যমে ক্লিক ও ইম্প্রেশন ট্র্যাক করা

কিছু মধ্যস্থতা করা SDK হয়ত নিজেরাই ক্লিক ও ইম্প্রেশন ট্র্যাক করতে পছন্দ করে। সেই ক্ষেত্রে, আপনার UnifiedNativeAdMapper-এর কনস্ট্রাক্টরে নিম্নলিখিত দুটি কল করে আপনাকে ডিফল্ট ক্লিক ও ইম্প্রেশন ট্র্যাকিং ওভাররাইড করতে হবে:

Java

setOverrideClickHandling(true);
setOverrideImpressionRecording(true);

ক্লিক ও ইম্প্রেশন ট্র্যাকিং ওভাররাইড করে এমন কাস্টম ইভেন্টকে Google Mobile Ads SDK-তে onAdClicked() ও onAdImpression() ইভেন্ট রিপোর্ট করতে হবে।

ইম্প্রেশন ও ক্লিক ট্র্যাক করতে, মধ্যস্থতা করা 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() পদ্ধতি অফার করে যা কাস্টম ইভেন্ট ওভাররাইড করতে পারে ভিউয়ের যেকোনও রেফারেন্স রিলিজ করতে এবং এটিকে নেটিভ বিজ্ঞাপন অবজেক্ট থেকে আলাদা করতে পারে।

GMA Next-Gen SDK-এ মধ্যস্থতা ইভেন্ট ফরওয়ার্ড করা

মধ্যস্থতা কাজ করে এমন সব কলব্যাক আপনি MediationNativeAdCallback ডকুমেন্ট থেকে জানতে পারবেন।

আপনার কাস্টম ইভেন্ট যেন এইসব কলব্যাক যতটা সম্ভব ফরওয়ার্ড করে, তা নিশ্চিত করা গুরুত্বপূর্ণ। এর ফলে আপনার অ্যাপ GMA Next-Gen SDK থেকে এইসব সমতুল্য ইভেন্ট পাবে। কলব্যাক ব্যবহারের একটি উদাহরণ এখানে দেওয়া হল:

এর ফলে নেটিভ বিজ্ঞাপনের জন্য কাস্টম ইভেন্ট প্রয়োগ করা সম্পূর্ণ হয়। সম্পূর্ণ উদাহরণ GitHub-এ উপলভ্য।