बिडिंग अडैप्टर का डेवलपमेंट

यह गाइड उन विज्ञापन नेटवर्क कंपनियों के लिए है जो Google मीडिएशन में रीयल-टाइम बिडिंग (आरटीबी) में हिस्सा लेने के लिए, बिडिंग अडैप्टर बनाना चाहती हैं. अगर आप पब्लिशर हैं, तो पब्लिशर मीडिएशन के निर्देश देखें.

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

बिडिंग की सुविधा सही तरीके से काम करे, इसके लिए आपके अडैप्टर को इन कामों को मैनेज करना होगा: शुरुआती सेटअप करना, सिग्नल इकट्ठा करना, विज्ञापन लोड करना, और विज्ञापन की लाइफ़साइकल से जुड़े इवेंट को रिले करना. इस गाइड में, हम आपको बताएंगे कि इन कार्रवाइयों को मैनेज करने के लिए, आपके अडैप्टर को कैसे लागू किया जाना चाहिए.

बिडिंग अडैप्टर का वर्कफ़्लो

डेटा लेयर में इवेंट बनाने की प्रोसेस

अडैप्टर की पूरी अनुरोध-जवाब-रेंडरिंग लाइफ़साइकल का ब्यौरा नीचे दिया गया है:

अडैप्टर, वर्कफ़्लो के इन हिस्सों के लिए ज़िम्मेदार होता है:

  • चौथा से सातवां चरण: अपने अडैप्टर को शुरू करें और शुरू होने के बाद, Google Mobile Ads SDK (Legacy) को कॉल बैक करें.

  • 10 से 13वां चरण: अपने विज्ञापन नेटवर्क एसडीके से सिग्नल इकट्ठा करें, ताकि उन्हें बिडिंग करने वाले को भेजा जा सके. इससे बिडिंग करने वाला, आरटीबी अनुरोध में हिस्सा ले सकेगा. इसके बाद, उन्हें Google Mobile Ads SDK को भेजें.

  • चरण 18-21: अगर बिडर, जीतने वाली बिड दिखाता है, तो बिडर से मिले रिस्पॉन्स के मुताबिक विज्ञापन लोड करें. लोड होने के बाद, Google Mobile Ads SDK (Legacy) को सूचना दें कि विज्ञापन लोड हो गया है.

  • 23वां और उसके बाद का चरण: जब आपका विज्ञापन दिख रहा हो, तब Google Mobile Ads SDK को इंप्रेशन और क्लिक इवेंट के बारे में सूचना दें. साथ ही, विज्ञापन की प्रज़ेंटेशन लाइफ़साइकल के दौरान होने वाले अन्य विज्ञापन इवेंट के बारे में भी बताएं.

बिडिंग अडैप्टर लागू करना

Google Mobile Ads SDK (Legacy) के लिए बिडिंग अडैप्टर बनाने के लिए, आपको RtbAdapter ऐब्स्ट्रैक्ट क्लास को एक्सटेंड करना होगा. यहां दिए गए सेक्शन में, RtbAdapter में मौजूद हर ऐब्स्ट्रैक्ट तरीके के बारे में बताया गया है.

getSDKVersionInfo()

यहां आपको अपने एसडीके का वर्शन दिखाना चाहिए. यह वर्शन, OpenRTB अनुरोध के हिस्से के तौर पर आपके बिडर को भेजा जाता है.

इस तरीके के लिए, आपको VersionInfo वापस करना होगा. यहां दिए गए उदाहरण में, अपने एसडीके के स्ट्रिंग वर्शन को VersionInfo. में बदलने का तरीका बताया गया है

@Override
public VersionInfo getSDKVersionInfo() {
  // Get your SDK's version as a string. E.g. "1.2.3"
  // String versionString = YourSdk.getVersion();
  String splits[] = versionString.split("\\.");
  if (splits.length >= 3) {
      int major = Integer.parseInt(splits[0]);
      int minor = Integer.parseInt(splits[1]);
      int micro = Integer.parseInt(splits[2]);
      return new VersionInfo(major, minor, micro);
   }

   String logMessage = String.format("Unexpected SDK version format: %s." +
           "Returning 0.0.0 for SDK version.", sdkVersion);
   Log.w(TAG, logMessage);
   return new VersionInfo(0, 0, 0);
}

getVersionInfo()

यहां आपको अपने अडैप्टर का वर्शन दिखाना चाहिए. यह वर्शन, OpenRTB अनुरोध के हिस्से के तौर पर आपके बिडर को भेजा जाता है.

Google के ओपन सोर्स और वर्शन वाले अडैप्टर, चार अंकों वाले अडैप्टर वर्शन स्कीम का इस्तेमाल करते हैं. हालांकि, VersionInfo में सिर्फ़ तीन अंकों की अनुमति होती है. इस समस्या को हल करने के लिए, हमारा सुझाव है कि आप आखिरी दो अंकों को पैच वर्शन में जोड़ें, जैसा कि यहां दिखाया गया है.

@Override
public VersionInfo getVersionInfo() {
  // Get your adapters's version as a string. E.g. "1.2.3.0"
  String versionString = BuildConfig.VERSION_NAME;
  String splits[] = versionString.split("\\.");
  if (splits.length >= 4) {
      int major = Integer.parseInt(splits[0]);
      int minor = Integer.parseInt(splits[1]);
      int micro = Integer.parseInt(splits[2]) * 100 + Integer.parseInt(splits[3]);
      return new VersionInfo(major, minor, micro);
    }

    String logMessage = String.format("Unexpected adapter version format: %s." +
                "Returning 0.0.0 for adapter version.", versionString);
    Log.w(TAG, logMessage);
    return new VersionInfo(0, 0, 0);
}

initialize()

टाइम आउट: 30 सेकंड

initialize() तरीका, आपके अडैप्टर में कॉल किया जाने वाला पहला तरीका है. इसे हर सेशन में सिर्फ़ एक बार कॉल किया जाता है. इस तरीके से, आपको MediationConfiguration ऑब्जेक्ट की एक सूची मिलती है. इसमें इस ऐप्लिकेशन में मौजूद उन सभी प्लेसमेंट की सूची होती है जिन्हें आपके विज्ञापन नेटवर्क कंपनी के लिए कॉन्फ़िगर किया गया है. हर प्लेसमेंट के क्रेडेंशियल को पार्स करने के लिए, इस सूची को लूप किया जा सकता है. साथ ही, SDK टूल को शुरू करने के लिए, काम का डेटा पास किया जा सकता है.

SDK टूल शुरू होने और विज्ञापन दिखाने का अनुरोध पाने के लिए तैयार होने के बाद, InitializationCompleteCallback के onInitializationSucceeded() तरीके को शुरू करें. यह कॉलबैक, ऐप्लिकेशन पब्लिशर को भेजा जाता है, ताकि उन्हें पता चल सके कि वे विज्ञापन लोड करना शुरू कर सकते हैं.

@Override
public void initialize(Context context,
    InitializationCompleteCallback initializationCompleteCallback,
    List<MediationConfiguration> mediationConfigurations) {
  // Initialize your ad network's SDK.
  ...

  // Invoke the InitializationCompleteCallback once initialization completes.
  initializationCompleteCallback.onInitializationSucceeded();
}

collectSignals()

टाइम आउट: एक सेकंड

जब भी पब्लिशर किसी विज्ञापन के लिए अनुरोध करता है, तब आपके RtbAdapter का एक नया इंस्टेंस बनाया जाता है और collectSignals() तरीके को कॉल किया जाता है. RtbAdapter के इस इंस्टेंस का इस्तेमाल, विज्ञापन दिखाने के अनुरोध, जवाब, और उस विज्ञापन की रेंडरिंग लाइफ़साइकल के दौरान किया जाएगा. collectSignals() तरीके से, आपके अडैप्टर को डिवाइस से सिग्नल मिलते हैं. इन सिग्नल को OpenRTB अनुरोध में, बिडिंग करने वाले को भेजा जाता है.

collectSignals() को बैकग्राउंड थ्रेड पर कॉल किया जाता है. Google Mobile Ads SDK (Legacy) बिडिंग में हिस्सा लेने वाले सभी अडैप्टर से एक साथ सिग्नल मांगता है. कृपया इस दौरान यूज़र इंटरफ़ेस (यूआई) थ्रेड को कॉल करने की संख्या सीमित रखें. सिग्नल इकट्ठा करने के लिए, आपके अडैप्टर या एसडीके को जो भी ज़रूरी काम करना है वह initialize() तरीके से किया जाना चाहिए और उसे कैश मेमोरी में सेव किया जाना चाहिए.

सिग्नल तैयार होने के बाद, एन्कोड किए गए सिग्नल के साथ onSuccess() कॉलबैक को कॉल करें.

यहां लागू करने का एक उदाहरण दिया गया है:

@Override
public void collectSignals(RtbSignalData rtbSignalData,
                           SignalCallbacks signalCallbacks) {
  String signals = YourSdk.getSignals();
  signalCallbacks.onSuccess(signals);
}

अगर आपका अडैप्टर सिग्नल इकट्ठा नहीं कर पाता है, तो signalCallbacks.onFailure() को कॉल करें. साथ ही, गड़बड़ी के बारे में बताने वाली स्ट्रिंग दें.

विज्ञापन लोड करने के तरीके लागू करना

टाइम आउट: 10 सेकंड

अगर बिडिंग करने वाला सिस्टम, जीतने वाली बिड दिखाता है, तो Google Mobile Ads SDK (Legacy) आपके अडैप्टर को कॉल करके, जीतने वाले विज्ञापन को लोड करता है. साथ ही, आपको वह डेटा भेजता है जो बिडिंग करने वाले सिस्टम ने दिखाया है और जिसकी ज़रूरत आपके SDK टूल को उस विज्ञापन को लोड करने के लिए होती है.

कॉल किया जाने वाला लोड मेथड, इस बात पर निर्भर करता है कि यह अनुरोध किस विज्ञापन फ़ॉर्मैट के लिए है:

विज्ञापन फ़ॉर्मैट लोड करने का तरीका
बैनर loadBannerAd()
इंटरस्टीशियल विज्ञापन loadInterstitialAd()
इनाम दिया गया loadRewardedAd()

आपका अडैप्टर जिन विज्ञापन फ़ॉर्मैट के साथ काम करता है उनके लिए ये तरीके लागू करें.

लोड मेथड को यूज़र इंटरफ़ेस (यूआई) थ्रेड पर कॉल किया जाता है. यह अडैप्टर के उसी इंस्टेंस पर होता है जिससे आपने सिग्नल दिए थे. इस तरीके से आपको ये पैरामीटर मिलते हैं:

  • एक MediationAdConfiguration, जिसमें ऐसे पैरामीटर होते हैं जिनकी ज़रूरत आपके SDK टूल को, जीतने वाली बिड के लिए विज्ञापन लोड करने के लिए होती है. जैसे, बिड रिस्पॉन्स और AdMob यूज़र इंटरफ़ेस में पब्लिशर के कॉन्फ़िगर किए गए क्रेडेंशियल.

  • MediationAdLoadCallback ऑब्जेक्ट का इस्तेमाल, विज्ञापन लोड होने या न होने पर Google Mobile Ads SDK (Legacy) को सूचना देने के लिए किया जाता है.

SDK टूल से विज्ञापन लोड होने के बाद, mediationAdLoadCallback.onSuccess() को कॉल करें. अगर विज्ञापन लोड नहीं हो पाता है, तो mediationAdLoadCallback.onFailure() को कॉल करें. साथ ही, गड़बड़ी के बारे में बताने वाली स्ट्रिंग दें.

mediationAdLoadCallback.onSuccess() तरीके के लिए, आपको एक ऐसा ऑब्जेक्ट पास करना होगा जो Google Mobile Ads SDK के तय किए गए "विज्ञापन" इंटरफ़ेस में से किसी एक की पुष्टि करता हो. इन विज्ञापन इंटरफ़ेस में, आपको विज्ञापन के बारे में कुछ जानकारी देनी होती है.

MediationAdConfiguration में getWatermark() तरीका भी होता है. इससे, PNG इमेज को दिखाने वाली base64-एन्कोड की गई स्ट्रिंग मिलती है. इस इमेज को आपके विज्ञापनों पर, पारदर्शी ओवरले में टाइल किया जाना चाहिए. वॉटरमार्क रेंडर करने के तरीके के बारे में ज़्यादा जानकारी पाने के लिए, Google से संपर्क करें. इसमें दिखाए जा रहे विज्ञापन का मेटाडेटा होता है. पब्लिशर इसका इस्तेमाल करके, दिखाए जा रहे विज्ञापनों के सोर्स का पता लगाते हैं.

बैनर के लिए, आपसे बैनर व्यू देने के लिए कहा जाएगा. पेज पर अचानक दिखने वाले (इंटरस्टीशियल) और इनाम वाले विज्ञापनों के लिए, आपको show() तरीका लागू करने के लिए कहा जाएगा, ताकि विज्ञापन को बाद में दिखाया जा सके. सबसे सही तरीके के तौर पर, हमारा सुझाव है कि आप विज्ञापन लोड करने वाली क्लास को इन विज्ञापन तरीकों को लागू करने के लिए भी ज़िम्मेदार बनाएं.

यहां loadBannerAd() को लागू करने का एक उदाहरण दिया गया है. ध्यान रखें कि आपके अडैप्टर का इंटिग्रेशन अलग दिखेगा, क्योंकि आपका अडैप्टर किसी दूसरे SDK टूल के साथ इंटिग्रेट होता है.

public final class SampleRtbAdapter extends RtbAdapter {
  ...

  @Override
  public void loadBannerAd(
      MediationBannerAdConfiguration adConfiguration,
      MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> callback) {

      SampleBannerRenderer bannerRenderer =
          new SampleBannerRenderer(adConfiguration, callback);
      bannerRenderer.render();
    }
}

// Renders a banner ad, and forwards callbacks to Google Mobile Ads SDK (Legacy).
public class SampleBannerRenderer implements MediationBannerAd {
  private MediationBannerAdConfiguration adConfiguration;
  private final MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> adLoadCallback;
  private AdView adView;
  private MediationBannerAdCallback callback;

  public SampleRtbBannerRenderer(
      MediationBannerAdConfiguration adConfiguration,
      MediationAdLoadCallback<MediationBannerAd, MediationBannerAdCallback> adLoadCallback) {
    this.adConfiguration = adConfiguration;
    this.adLoadCallback = adLoadCallback;
  }

  public void render() {
    adView = new AdView(adConfiguration.getContext());
    adView.setAdSize(adConfiguration.getAdSize());
    // serverParameters are the parameters entered in the AdMob UI for your network.
    adView.setAdUnitId(adConfiguration.getServerParameters().getString("adUnitId"));

    // Map the callbacks from your SDK to Google's SDK.
    adView.setAdListener(new AdListener() {
      // See the next step for more information on callback mapping.
      // ...
    });

    // Get the bid response and watermark from the ad configuration and
    // pass the relevant information to your SDK.
    String ad = adConfiguration.getBidResponse();
    String watermark = adConfiguration.getWatermark();
    Bundle extras = new Bundle();
    extras.putString("bid", ad);
    extras.putString("watermark", watermark);
    AdRequest request = new AdRequest.Builder()
        .addNetworkExtrasBundle(AdMobAdapter.class, extras)
        .build();
    adView.loadAd(request);
  }

  // MediationBannerAd implementation

  @NonNull
  @Override
  public View getView() {
    return adView;
  }
}

विज्ञापन प्रज़ेंटेशन के लाइफ़साइकल इवेंट को रिले करना

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

ज़रूरत पड़ने पर, अडैप्टर को ये इवेंट ट्रिगर करने चाहिए:

सभी फ़ॉर्मैट के लिए सामान्य
तरीका कॉल करने का समय
reportAdClicked() विज्ञापन पर क्लिक किया गया.
reportAdImpression() विज्ञापन ने एक इंप्रेशन रेंडर किया.
onAdOpened() विज्ञापन, फ़ुल स्क्रीन व्यू में दिखाया गया हो.
onAdClosed() विज्ञापन का फ़ुल स्क्रीन व्यू बंद कर दिया गया है.
onAdLeftApplication() विज्ञापन की वजह से, उपयोगकर्ता ने ऐप्लिकेशन को बंद कर दिया.
इनाम वाले विज्ञापन
onRewarded() उपयोगकर्ता को इनाम दिया जाता है.
वीडियो कॉलबैक (इनाम वाले और नेटिव विज्ञापन)
onVideoStarted() विज्ञापन का वीडियो शुरू हुआ.
onVideoCompleted() विज्ञापन का वीडियो पूरा देखा गया.

mediationAdLoadCallback.onSuccess() को कॉल करने पर, अडैप्टर को MediationAdLoadCallback<MediationAdT, MediationAdCallbackT> ऑब्जेक्ट वापस मिलता है. अडैप्टर से उम्मीद की जाती है कि वे इस ऑब्जेक्ट को बनाए रखें और इसका इस्तेमाल करके, आपके विज्ञापन पर होने वाले प्रज़ेंटेशन इवेंट को ट्रिगर करें.

आम तौर पर, इनमें से ज़्यादातर इवेंट आपके विज्ञापन नेटवर्क के SDK टूल से ट्रिगर होते हैं. अडैप्टर का काम सिर्फ़ आपके विज्ञापन नेटवर्क कंपनी के SDK टूल से मिलने वाले कॉलबैक को Google Mobile Ads SDK (Legacy) पर मैप करना है.

यहां दिए गए उदाहरण में, अपने एसडीके के विज्ञापन लिसनर से Google Mobile Ads SDK (Legacy) पर कॉलबैक फ़ॉरवर्ड करने का तरीका बताया गया है:

adView.setAdListener(new AdListener() {
    public void onAdLoaded() {
        callback = adLoadCallback.onSuccess(SampleBannerRenderer.this);
    }

    public void onAdImpression() {
        if (callback != null) {
            callback.reportAdImpression();
        }
    }

    public void onAdFailedToLoad(LoadAdError adError) {
        adLoadCallback.onFailure("Error: " + adError.toString());
    }

    public void onAdClosed() {
        if (callback != null) {
            callback.onAdClosed();
        }
    }

    public void onAdOpened() {
        if (callback != null) {
            callback.onAdOpened();
            callback.reportAdClicked();
        }
    }

    public void onAdLeftApplication() {
        if (callback != null) {
            callback.onAdLeftApplication();
        }
    }
});

नेटिव विज्ञापन इंप्रेशन ट्रैकिंग के लिए ज़रूरी ऐसेट

Google Mobile Ads SDK (Legacy), नेटिव विज्ञापन के लिए तब इंप्रेशन रिकॉर्ड करता है, जब विज्ञापन का 1 पिक्सल दिखता है. अगर आपके विज्ञापन नेटवर्क के एसडीके को मान्य इंप्रेशन रेंडर करने के लिए, कुछ खास ऐसेट दिखाने की ज़रूरत है, तो बिडिंग करने वाला व्यक्ति या कंपनी, बिड रिस्पॉन्स में इन ज़रूरी नेटिव ऐसेट के बारे में बता सकती है. इसके बाद, Google Mobile Ads SDK (Legacy) यह पुष्टि करता है कि इंप्रेशन रिकॉर्ड करने से पहले, आपकी ज़रूरी नेटिव ऐसेट दिख रही हैं या नहीं.

बिड रिस्पॉन्स में अन्य ज़रूरी ऐसेट के बारे में बताने के तरीके के बारे में ज़्यादा जानकारी के लिए, नेटिव ज़रूरी ऐसेट का दस्तावेज़ देखें.

विज्ञापन से जुड़ी गड़बड़ियां दिखाना

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

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

हालांकि, कुछ मामलों में ऐसा हो सकता है कि आपको विज्ञापन न दिखे. अगर विज्ञापन नहीं दिखाया जा सकता, तो इंप्रेशन रद्द करने के लिए, onAdFailedToShow() कॉलबैक को कॉल करें.

नीचे दी गई टेबल में बताया गया है कि प्रज़ेंटेशन कॉलबैक, फ़ुल स्क्रीन विज्ञापन फ़ॉर्मैट के लिए इंप्रेशन रिकॉर्डिंग पर कैसे असर डालते हैं:

कॉलबैक नतीजा
onAdOpened() Impression recorded
onAdFailedToShow() Impression failure1
इनमें से कोई भी विकल्प कुछ सेकंड तक न दिखे Impression recorded

1 फ़ेल हो चुके इंप्रेशन के लिए, आपकी विज्ञापन नेटवर्क कंपनी से शुल्क नहीं लिया जाता. हालांकि, इससे शुल्क वाले इवेंट की दर में होने वाले अडजस्टमेंट पर असर पड़ता है. ज़्यादा जानकारी के लिए, बिड रिक्वेस्ट के सिग्नल देखें.

नीचे दिए गए मॉक उदाहरण में, लोड/दिखाने की लाइफ़साइकल के बारे में बताया गया है. इसमें विज्ञापन दिखाने के लिए किया गया कॉल, फ़ेल हो सकता है.

final class SampleRtbAdapter extends RtbAdapter implements MediationRewardedAd {

 private MediationRewardedAdCallback callback;
 private RewardedAd rewardedAd;

 ...

  @Override
  public void loadRewardedAd(
      MediationRewardedAdConfiguration adConfiguration,
      final MediationAdLoadCallback<MediationRewardedAd, MediationRewardedAdCallback> loadCallback) {

    // Load an ad. This mock example uses Google's SDK, but in practice
    // your adapter will load the ad using your ad network's SDK.
    RewardedAd.load(adConfiguration.getContext(),
        "ca-app-pub-3940256099942544/5224354917",
        new AdRequest.Builder().build(),
        new RewardedAdLoadCallback() {
          @Override
          public void onAdLoaded(@NonNull RewardedAd rewardedAd) {
            // When the ad loads, invoke the load success callback.
            callback = loadCallback.onSuccess(SampleRtbAdapter.this);
          }
        });
  }

  @Override
  public void showAd(Context context) {
    // In this mock example, your ad network requires an activity context, but
    // didn't receive one, making you unable to show the ad.
    if (!(context instanceof Activity)) {
      AdError error = new AdError(1, "Context must be an activity",
          "com.google.ads.mediation.sample");
      callback.onAdFailedToShow(error);
    }

    // This example shows Google SDK's callbacks, but it's likely your SDK
    // has similar presentation callbacks.
    rewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() {
      @Override
      public void onAdShowedFullScreenContent() {
        // Your ad network SDK successfully showed the ad. Call onAdOpened().
        callback.onAdOpened();
      }

      @Override
      public void onAdFailedToShowFullScreenContent(AdError adError) {
        // Your ad network SDK failed to show the ad, invoke onAdFailedToShow.
        // In practice, you will map your SDK's error to an AdError.
        AdError error = new AdError(adError.getCode(), adError.getMessage(),
            adError.getDomain());
        callback.onAdFailedToShow(adError);
      }
    });


    rewardedAd.show((Activity) context, ...);
  }
}