أشكال الإعلانات المدمجة مع المحتوى المخصّصة
بالإضافة إلى أشكال الإعلانات المدمجة مع المحتوى التي يحدّدها النظام، يتوفّر لصنّاع المحتوى في "مدير إعلانات Google"
خيار إنشاء أشكال إعلانات مدمجة مع المحتوى من خلال تحديد قوائم مخصّصة
للمواد. وتُعرف هذه الإعلانات باسم أشكال الإعلانات المدمجة مع المحتوى المخصّصة
، ويمكن استخدامها مع
الإعلانات المحجوزة. ويسمح هذا للناشرين بإتاحة بيانات منظَّمة عشوائية
لتطبيقاتهم. يتم تمثيل هذه الإعلانات بواسطة
NativeCustomFormatAd
الخاص بك.
تحميل أشكال الإعلان المدمج المخصصة
يوضّح هذا الدليل كيفية تحميل تنسيقات الإعلانات المدمجة المخصّصة وعرضها.
إنشاء AdLoader
مثل الإعلانات المدمجة مع المحتوى
يتم تحميل أشكال الإعلانات المدمجة المخصصة باستخدام الفئة 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
عدة مرات باستخدام قيم
أرقام تعريف أشكال الإعلانات من أجل إعداد أداة تحميل الإعلانات لأكثر من واحد ممكن
شكل الإعلان المدمج المخصص.
الرقم التعريفي المخصص لشكل الإعلان المدمج مع المحتوى
يمكن العثور على رقم تعريف التنسيق المستخدَم لتحديد شكل إعلان مخصّص مدمج مع المحتوى في واجهة مستخدِم "مدير إعلانات Google" ضمن قسم الإعلانات المدمجة مع المحتوى في القائمة المنسدلة العرض:
يظهر رقم تعريف كل شكل إعلان مخصّص مدمج مع المحتوى بجانب اسمه. يؤدي النقر على أحد تظهر لك شاشة تفاصيل تعرض معلومات عن تنسيق الحقول:
من هنا، يمكن إضافة حقول فردية وتعديلها وإزالتها. لاحظ اسم كل مادة عرض الاسم هو المفتاح المستخدَم للحصول على بيانات كل مادة عرض عند عرض تنسيق الإعلان المُدمَج مع المحتوى المخصّص.
عرض أشكال إعلان مدمج مخصصة
تختلف أشكال الإعلانات المدمجة المخصصة عن الأشكال التي يحددها النظام من حيث أن الناشرين القدرة على تحديد قائمة الأصول التي تؤدي إلى لعرض إعلان. وبالتالي، تختلف عملية عرض البيانات عن عملية تحديد النظام بتنسيقات متعددة:
- لأنّ الفئة
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)، يجب أن تتضمّن الإعلانات المحجوزة المعروضة في المنطقة الاقتصادية الأوروبية رمز AdChoices ورابطًا إلى صفحة "تفاصيل عن الإعلان" من Google. عند تنفيذ إعلانات مدمجة مع المحتوى مخصصة، تكون أنت المسؤول عن عرض "رمز "خيارات الإعلان ننصحك باتخاذ خطوات لعرض رمز AdChoices وإعداد مستمع النقرات له عند عرض مواد عرض الإعلانات الرئيسية.
يفترض المثال التالي أنك حددت عنصر <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
لعرض مادة العرض هذه.
الرد على إجراءات النقر المخصّصة
عند النقر على إعلان بتنسيق مخصّص، هناك ثلاثة possible ردود من حزمة تطوير البرامج (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 لتتبُّع الجهات الخارجية التي تم ضبطها لمواد الإنتاج، وتنفيذ مهام أخرى في الخلفية بدون أي رمز إضافي.