أشكال الإعلانات المدمجة مع المحتوى المخصّصة
بالإضافة إلى أشكال الإعلانات المدمجة مع المحتوى التي يحددها النظام، يحصل ناشرو "مدير الإعلانات" على
إمكانية إنشاء أشكال الإعلانات المدمجة مع المحتوى من خلال تحديد قوائم مخصصة
الأصول. يُطلق على هذه الإعلانات اسم الإعلانات المدمجة مع المحتوى المخصّصة
والتنسيقات، ويمكن استخدامها مع
إعلانات محجوزة. يتيح ذلك للناشرين تمرير البيانات المنظَّمة العشوائية إلى
تطبيقاتهم. يتم تمثيل هذه الإعلانات بكائن
NativeCustomFormatAd
.
تحميل أشكال الإعلان المدمج المخصصة
يشرح هذا الدليل كيفية تحميل أشكال الإعلانات المدمجة المخصصة وعرضها.
إنشاء أداة تحميل إعلانات
مثل الإعلانات المدمجة مع المحتوى
يتم تحميل أشكال الإعلانات المدمجة المخصصة باستخدام الفئة AdLoader
:
Java
AdLoader adLoader = new AdLoader.Builder(context, "/21775744923/example/native") .forCustomFormatAd("10063170", new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() { @Override public void onCustomFormatAdLoaded(NativeCustomFormatAd ad) { // Show the custom format and record an impression. } }, new NativeCustomFormatAd.OnCustomClickListener() { @Override public void onCustomClick(NativeCustomFormatAd ad, String s) { // Handle the click action } }) .withAdListener( ... ) .withNativeAdOptions( ... ) .build();
Kotlin
val adLoader = AdLoader.Builder(this, "/21775744923/example/native") .forCustomFormatAd("10063170", { ad -> // Show the custom format and record an impression. }, { ad, s -> // Handle the click action }) .withAdListener( ... ) .withNativeAdOptions( ... ) .build()
تعمل الطريقة forCustomFormatAd
على ضبط AdLoader
لطلب خيار
أشكال الإعلانات المدمجة مع المحتوى. هناك ثلاث معلمات يتم إدخالها في الطريقة:
- رقم تعريف شكل الإعلان المدمج المخصّص الذي يجب أن يطلبه
AdLoader
. على كل يشتمل شكل الإعلان المدمج المخصص على معرّف مرتبط به. هذا النمط تشير هذه المَعلمة إلى التنسيق الذي يريد تطبيقك أن يطلبه تطبيقك من خلال "AdLoader
". - إنّ
OnCustomFormatAdLoadedListener
سيتم استدعاؤه عند تحميل الإعلان بنجاح. - حقل اختياري
OnCustomClickListener
ليتم الاستدعاء عندما ينقر المستخدم على الإعلان. لمزيد من المعلومات حول هذا الموضوع مستمع، راجع عمود "التعامل مع النقرات ومرات الظهور" أدناه.
بما أنّه يمكن إعداد وحدة إعلانية واحدة لعرض أكثر من شكل واحد لتصميم الإعلان، يمكن استدعاء forCustomFormatAd
عدة مرات باستخدام أرقام تعريف فريدة لأشكال الإعلانات من أجل إعداد أداة تحميل الإعلانات لأكثر من شكل واحد ممكن
لإعلان مدمج مع المحتوى المخصّص.
الرقم التعريفي المخصص لشكل الإعلان المدمج مع المحتوى
يمكن استخدام رقم تعريف الشكل المستخدَم لتحديد شكل إعلان مدمج مخصّص والموجودة في واجهة مستخدم "مدير الإعلانات" ضمن قسم الإعلانات المدمجة مع المحتوى داخل عرض الإعلانات القائمة المنسدلة:
ويظهر كل رقم تعريف مخصّص لشكل الإعلان المدمج مع المحتوى بجانب اسمه. يؤدي النقر على أحد تظهر لك شاشة تفاصيل تعرض معلومات عن تنسيق الحقول:
من هنا، يمكن إضافة حقول فردية وتعديلها وإزالتها. لاحظ اسم كل مادة عرض الاسم هو المفتاح المستخدم للحصول على بيانات كل مادة عرض عند عرض شكل الإعلان المدمج المخصص
عرض أشكال إعلان مدمج مخصصة
تختلف أشكال الإعلانات المدمجة المخصصة عن الأشكال التي يحددها النظام من حيث أن الناشرين القدرة على تحديد قائمة الأصول التي تؤدي إلى لعرض إعلان. وبالتالي، تختلف عملية عرض البيانات عن عملية تحديد النظام بتنسيقات متعددة:
- لأنّ الفئة
NativeCustomFormatAd
مخصّصة للتعامل مع أي من أشكال الإعلانات المدمجة المخصصة التي تحددها في "مدير الإعلانات"، وهي غير محددة "getters" عن الأصول. بدلاً من ذلك، يوفّر طرقًا مثلgetText
وgetImage
التي تأخذ اسم الحقل كمَعلمة. - لا توجد فئة مخصصة لمشاهدة الإعلانات مثل
NativeAdView
لاستخدامها معNativeCustomFormatAd
لك مطلق الحرية في استخدام أي تخطيط يجعله تجربة المستخدم الخاص بك. - ليس عليك التسجيل بسبب عدم توفّر صف
ViewGroup
مخصّص. أيٌّ من المشاهدات التي تستخدمها لعرض مواد عرض الإعلان. يوفر هذا بضعة أسطر من الرمز عند عرض الإعلان، ولكنه يعني أيضًا أنك ستحتاج إلى إجراء المزيد والعمل على معالجة النقرات لاحقًا.
إليك مثال على دالة تعرض NativeCustomFormatAd
:
Java
public void displayCustomFormatAd (ViewGroup parent, NativeCustomFormatAd customFormatAd) { // Inflate a layout and add it to the parent ViewGroup. LayoutInflater inflater = (LayoutInflater) parent.getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View adView = inflater.inflate(R.layout.custom_format_ad, parent); // Locate the TextView that will hold the value for "Headline" and // set its text. TextView myHeadlineView = (TextView) adView.findViewById(R.id.headline); myHeadlineView.setText(customFormatAd.getText("Headline")); // Locate the ImageView that will hold the value for "MainImage" and // set its drawable. Button myMainImageView = (ImageView) adView.findViewById(R.id.main_image); myMainImageView.setImageDrawable( customFormatAd.getImage("MainImage").getDrawable()); ... // Continue locating views and displaying assets until finished. ... }
Kotlin
public fun displayCustomFormatAd (parent: ViewGroup, customFormatAd: NativeCustomFormatAd) { val adView = layoutInflater .inflate(R.layout.ad_simple_custom_format, null) val myHeadlineView = adView.findViewById<TextView>(R.id.headline) myHeadlineView.setText(customFormatAd.getText("Headline")); // Locate the ImageView that will hold the value for "MainImage" and // set its drawable. val myMainImageView = adView.findViewById(R.id.main_image); myMainImageView.setImageDrawable( customFormatAd.getImage("MainImage").drawable); ... // Continue locating views and displaying assets until finished. ... }
عرض رمز "خيارات الإعلان"
كجزء من دعم قانون الخدمات الرقمية (DSA)، تتطلب الإعلانات المحجوزة التي يتم عرضها في المنطقة الاقتصادية الأوروبية رمز "خيارات الإعلان" ورابط إلى صفحة "تفاصيل عن الإعلان" في Google. عند تنفيذ إعلانات مدمجة مع المحتوى مخصصة، تكون أنت المسؤول عن عرض "رمز "خيارات الإعلان ننصحك باتخاذ خطوات لعرض النقرة وضبطها المستمع إلى رمز "خيارات الإعلان" عند عرض مواد عرض الإعلان الرئيسية.
يفترض المثال التالي أنك حددت عنصر <ImageView />
في
التسلسل الهرمي لطريقة العرض لحمل شعار "خيارات الإعلان".
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/adChoices"
android:layout_width="15dp"
android:layout_height="15dp"
android:adjustViewBounds="true"
android:contentDescription="AdChoices icon." />
</LinearLayout>
تعرض الأمثلة التالية رمز "خيارات الإعلان" تهيئة سلوك النقر المناسب.
Java
private AdSimpleCustomTemplateBinding customTemplateBinding;
private void populateAdView(final NativeCustomFormatAd nativeCustomFormatAd) {
// Render the AdChoices icon.
String adChoicesKey = NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW;
NativeAd.Image adChoicesAsset = nativeCustomFormatAd.getImage(adChoicesKey);
if (adChoicesAsset == null) {
customTemplateBinding.adChoices.setVisibility(View.GONE);
} else {
customTemplateBinding.adChoices.setVisibility(View.VISIBLE);
customTemplateBinding.adChoices.setImageDrawable(adChoicesAsset.getDrawable());
// Enable clicks on AdChoices.
customTemplateBinding.adChoices.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
nativeCustomFormatAd.performClick(adChoicesKey);
}
});
}
...
}
Kotlin
private lateinit var customTemplateBinding: AdSimpleCustomTemplateBinding
private fun populateAdView(nativeCustomFormatAd: NativeCustomFormatAd) {
// Render the AdChoices icon.
val adChoicesKey = NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW
val adChoicesAsset = nativeCustomFormatAd.getImage(adChoicesKey)
if (adChoicesAsset == null) {
customTemplateBinding.adChoices.visibility = View.GONE
} else {
customTemplateBinding.adChoices.setImageDrawable(adChoicesAsset.drawable)
customTemplateBinding.adChoices.visibility = View.VISIBLE
// Enable clicks on AdChoices.
customTemplateBinding.adChoices.setOnClickListener {
nativeCustomFormatAd.performClick(adChoicesKey)
}
}
...
}
فيديو مدمج مع المحتوى لأشكال الإعلانات المدمجة مع المحتوى المخصّصة
عند إنشاء تنسيق مخصّص: يمكنك اختيار التنسيق المناسب للفيديو.
في عملية تنفيذ التطبيق، يمكنك استخدام
NativeCustomFormatAd.getMediaContent()
للحصول على محتوى الوسائط. اتصِل بعد ذلك بالرقم setMediaContent()
.
لضبط محتوى الوسائط على طريقة عرض الوسائط. إلى طريقة عرض الوسائط.
إذا لم يكن الإعلان يتضمّن محتوى فيديو، ضَع خططًا بديلة للعرض.
الإعلان بدون فيديو.
يتحقق المثال أدناه مما إذا كان الإعلان يتضمن محتوى فيديو ويعرض صورة مكانه في حال عدم توفّر فيديو:
Java
// Called when a custom native ad loads. @Override public void onCustomFormatAdLoaded(final NativeCustomFormatAd ad) { MediaContent mediaContent = ad.getMediaContent(); // Assumes you have a FrameLayout in your view hierarchy with the id media_placeholder. FrameLayout mediaPlaceholder = (FrameLayout) findViewById(R.id.media_placeholder); // Apps can check the MediaContent's hasVideoContent property to determine if the // NativeCustomFormatAd has a video asset. if (mediaContent != null && mediaContent.hasVideoContent()) { MediaView mediaView = new MediaView(mediaPlaceholder.getContext()); mediaView.setMediaContent(mediaContent); mediaPlaceholder.addView(mediaView); // Create a new VideoLifecycleCallbacks object and pass it to the VideoController. The // VideoController will call methods on this object when events occur in the video // lifecycle. VideoController vc = mediaContent.getVideoController(); vc.setVideoLifecycleCallbacks( new VideoController.VideoLifecycleCallbacks() { @Override public void onVideoEnd() { // Publishers should allow native ads to complete video playback before // refreshing or replacing them with another ad in the same UI location. super.onVideoEnd(); } }); } else { ImageView mainImage = new ImageView(this); mainImage.setAdjustViewBounds(true); mainImage.setImageDrawable(ad.getImage("MainImage").getDrawable()); mediaPlaceholder.addView(mainImage); mainImage.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { ad.performClick("MainImage"); } }); } }
Kotlin
// Called when a custom native ad loads. NativeCustomFormatAd.OnCustomFormatAdLoadedListener { ad -> val mediaContent = ad.mediaContent // Apps can check the MediaContent's hasVideoContent property to determine if the // NativeCustomFormatAd has a video asset. if (mediaContent != null && mediaContent.hasVideoContent()) { val mediaView = MediaView(mediaPlaceholder.getContest()) mediaView.mediaContent = mediaContent val videoController = mediaContent.videoController // Create a new VideoLifecycleCallbacks object and pass it to the VideoController. The // VideoController will call methods on this object when events occur in the video // lifecycle. if (videoController != null) { videoController.videoLifecycleCallbacks = object : VideoController.VideoLifecycleCallbacks() { override fun onVideoEnd() { // Publishers should allow native ads to complete video playback before refreshing // or replacing them with another ad in the same UI location. super.onVideoEnd() } } } } else { val mainImage = ImageView(this) mainImage.adjustViewBounds = true mainImage.setImageDrawable(ad.getImage("MainImage")?.drawable) mainImage.setOnClickListener { ad.performClick("MainImage") } customTemplateBinding.simplecustomMediaPlaceholder.addView(mainImage) } }
يمكنك الاطّلاع على MediaContent للحصول على مزيد من المعلومات حول كيفية تخصيص تجربة الفيديو لإعلان مدمج مع المحتوى مخصص.
تنزيل العرض المخصّص في "مدير الإعلانات" مثال لـ كمثال عملي على فيديو مدمج مع المحتوى.
عدد النقرات ومرات الظهور لأشكال الإعلانات المدمجة مع المحتوى المخصصة
باستخدام أشكال الإعلانات المدمجة مع المحتوى المخصصة، يكون تطبيقك مسؤولاً عن تسجيل مرّات الظهور وأحداث النقر لإعداد التقارير في "SDK لإعلانات Google على الأجهزة الجوّالة".
تسجيل مرّات الظهور
لتسجيل مرة ظهور لإعلان بتنسيق مخصّص، اتصل برقم recordImpression
.
على NativeCustomFormatAd
المقابلة:
myCustomFormatAd.recordImpression();
إذا كان تطبيقك يتطلب عن طريق الخطأ الطريقة مرتين للإعلان نفسه، فإن حزمة تطوير البرامج (SDK) تمنع تلقائيًا تسجيل مرة ظهور مكررة طلبك.
الإبلاغ عن النقرات
لإرسال تقرير إلى حزمة تطوير البرامج (SDK) بحدوث نقرة على إحدى مشاهدات مادة العرض، اطلب
إجراء performClick
على NativeCustomFormatAd
المقابل وتمريره
اسم مادة العرض التي تم النقر عليها على سبيل المثال، إذا كان لديك مادة عرض في
تنسيقك المخصص المسمى "MainImage" وأراد الإبلاغ عن نقرة على
ImageView
التي تتوافق مع مادة العرض هذه، سيظهر الرمز على النحو التالي:
myCustomFormatAd.performClick("MainImage");
تجدر الإشارة إلى أنّك لست بحاجة إلى استدعاء هذه الطريقة لكل ملف شخصي مرتبط
إعلانك. إذا كان لديك حقل آخر يُسمى "الترجمة والشرح" كان من المفترض أن يتم
عرضه ولكن لم ينقر عليه المستخدم، لن يحتاج تطبيقك إلى
استدعاء performClick
لعرض مادة العرض هذه.
الرد على إجراءات النقر المخصّصة
عند إجراء نقرة على إعلان شكل مخصّص، هناك ثلاثة إعلانات محتملة الاستجابات من حزمة تطوير البرامج (SDK) التي تمت المحاولة معها بالترتيب التالي:
- استدعِ
OnCustomClickListener
منAdLoader
، إذا تم توفير واحد. - بالنسبة إلى كل عنوان من عناوين URL لروابط صفحات التطبيق في الإعلان، حاوِل العثور على أداة تحليل محتوى. وتبدأ النوع الأول الذي يتم حله.
- افتح متصفحًا وانتقل إلى عنوان URL المقصود التقليدي للإعلان.
تقبل طريقة forCustomFormatAd
OnCustomClickListener
. إذا كنت
تمرير كائن أداة استماع إلى داخلها، تستدعي حزمة تطوير البرامج (SDK) بدلاً من ذلك طريقة onCustomClick
ولا تتخذ أي إجراء آخر. ولكن إذا مررت قيمة فارغة كأداة استماع،
فإن حزمة SDK تعود إلى روابط الصفحات في التطبيق و/أو عناوين URL المقصودة المسجلة في
الإعلان.
تسمح أدوات معالجة النقرات المخصّصة لتطبيقك بتحديد أفضل إجراء يجب اتخاذه الاستجابة لنقرة، سواء من خلال تحديث واجهة المستخدم أو إطلاق نشاط جديد أو مجرد تسجيل النقرة. في ما يلي مثال يسجّل ببساطة البيانات التي تم الحصول عليها المكان:
Java
AdLoader adLoader = new AdLoader.Builder(context, "/21775744923/example/native") .forCustomFormatAd("10063170", new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() { // Display the ad. }, new NativeCustomFormatAd.OnCustomClickListener() { @Override public void onCustomClick(NativeCustomFormatAd ad, String assetName) { Log.i("MyApp", "A custom click just happened for " + assetName + "!"); } }).build();
Kotlin
val adLoader = AdLoader.Builder(this, "/21775744923/example/native") .forCustomFormatAd("10063170", { ad -> // Display the ad. }, { ad, assetName -> Log.i("MyApp", "A custom click just happened for $assetName!") }).build()
في البداية، قد يبدو الأمر غريبًا أن يتم العثور على أدوات استماع للنقرات المخصّصة. بعد كل شيء، أبلَغ تطبيقك لحزمة تطوير البرامج (SDK) للتو بحدوث نقرة، فلماذا يجب تشغيل حزمة SDK؟ وإبلاغ التطبيق بذلك؟
يُعد تدفق المعلومات هذا مفيدًا لعدة أسباب، ولكن الأهم من ذلك أنه تسمح لحزمة SDK بالتحكّم في الاستجابة للنقرة مُمْكِنْ اختبار الاتصال التلقائي بعناوين URL لتتبع الجهات الخارجية التي تم تعيينها الإبداعية، على سبيل المثال، والتعامل مع المهام الأخرى وراء الكواليس، دون تعليمة برمجية إضافية.