ज़रूरी शर्तें
कस्टम इवेंट सेट अप करने की प्रोसेस पूरी करें.
नेटिव विज्ञापन का अनुरोध करना
जब वॉटरफ़ॉल मीडिएशन चेन में, कस्टम इवेंट लाइन आइटम पर पहुंचा जाता है,
तो कस्टम इवेंट बनाते समय दिए गए क्लास के नाम पर 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 को विज्ञापन इवेंट के कॉल बैक पाना और उनकी रिपोर्ट करना.
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()को कॉल करना होगा.
MediationNativeAd को लागू करने वाली क्लास का इंस्टेंस पास करके, onSuccess() को कॉल किया जाता है.
आम तौर पर, ये मैथड, आपके अडैप्टर के लागू किए गए तीसरे पक्ष के SDK टूल से मिलने वाले कॉल बैक के अंदर लागू किए जाते हैं. इस उदाहरण के लिए, सैंपल 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 टूल के पास, नेटिव विज्ञापनों के लिए अपने यूनीक फ़ॉर्मैट होते हैं. उदाहरण के लिए, हो सकता है कि एक SDK टूल ऐसे ऑब्जेक्ट लौटाए जिनमें "टाइटल" फ़ील्ड हो, जबकि दूसरे में "हेडलाइन" हो. इसके अलावा, इंप्रेशन ट्रैक करने और क्लिक प्रोसेस करने के लिए इस्तेमाल किए जाने वाले मैथड, एक SDK टूल से दूसरे में अलग-अलग हो सकते हैं.
UnifiedNativeAdMapper इन अंतरों को ठीक करने और
मीडिएट किए गए SDK टूल के नेटिव विज्ञापन ऑब्जेक्ट को,
Google Mobile Ads SDK के इंटरफ़ेस से मैच करने के लिए ज़िम्मेदार है. कस्टम इवेंट को इस क्लास को एक्सटेंड करना चाहिए, ताकि वे मीडिएट किए गए 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 को लोकल वैरिएबल के तौर पर सेव किया जाता है.
मैप की गई एसेट की प्रॉपर्टी सेट करना
कंस्ट्रक्टर, 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
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, सैंपल SDK की "डिग्री ऑफ़ ऑसमनेस" एसेट के लिए इसका इस्तेमाल करता है:
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 और मीडिएट किए गए SDK टूल, दोनों को यह जानने की ज़रूरत होती है कि इंप्रेशन या क्लिक कब हुआ. हालांकि, इनमें से सिर्फ़ एक SDK टूल को इन इवेंट को ट्रैक करने की ज़रूरत होती है. कस्टम इवेंट, दो अलग-अलग तरीकों का इस्तेमाल कर सकते हैं. यह इस बात पर निर्भर करता है कि मीडिएट किया गया SDK टूल, अपने-आप इंप्रेशन और क्लिक ट्रैक करता है या नहीं.
Google Mobile Ads SDK से क्लिक और इंप्रेशन ट्रैक करना
अगर मीडिएट किया गया SDK टूल, अपने-आप इंप्रेशन और क्लिक ट्रैक नहीं करता है, लेकिन
क्लिक और इंप्रेशन रिकॉर्ड करने के लिए मैथड उपलब्ध कराता है, तो Google Mobile Ads SDK इन इवेंट को
ट्रैक कर सकता है और अडैप्टर को सूचना दे सकता है. UnifiedNativeAdMapper क्लास में दो मैथड शामिल होते हैं: recordImpression() और handleClick(). कस्टम इवेंट, मीडिएट किए गए नेटिव विज्ञापन ऑब्जेक्ट पर, इनसे जुड़े मैथड को कॉल करने के लिए, इन्हें लागू कर सकते हैं:
Java
@Override public void recordImpression() { sampleAd.recordImpression(); } @Override public void handleClick(View view) { sampleAd.handleClick(view); }
SampleNativeAdMapper के पास, सैंपल 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() मैथड उपलब्ध कराता है. कस्टम इवेंट, व्यू के किसी भी रेफ़रंस को रिलीज़ करने और उसे नेटिव विज्ञापन ऑब्जेक्ट से अलग करने के लिए, इसे बदल सकते हैं.
मीडिएशन इवेंट को Google Mobile Ads SDK पर फ़ॉरवर्ड करना
`MediationNativeAdCallback` के दस्तावेज़ में, आपको वे सभी कॉल बैक मिलेंगे जिन्हें मीडिएशन की सुविधा से इस्तेमाल किया जा सकता है.MediationNativeAdCallback
यह ज़रूरी है कि आपका कस्टम इवेंट, इनमें से ज़्यादा से ज़्यादा कॉल बैक को फ़ॉरवर्ड करे, ताकि आपके ऐप्लिकेशन को Google Mobile Ads SDK से, इनसे जुड़े इवेंट मिल सकें. कॉल बैक का इस्तेमाल करने का एक उदाहरण यहां दिया गया है:
यहां नेटिव विज्ञापनों के लिए, कस्टम इवेंट लागू करने की प्रोसेस पूरी होती है. पूरा उदाहरण उपलब्ध है GitHub पर.