أشكال الإعلانات المدمجة مع المحتوى المخصّصة

أشكال الإعلانات المدمجة مع المحتوى المخصّصة

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

الرقم التعريفي المخصص لشكل الإعلان المدمج مع المحتوى

يمكن استخدام رقم تعريف الشكل المستخدَم لتحديد شكل إعلان مدمج مخصّص موجودة في واجهة مستخدم "مدير الإعلانات" ضمن قسم الإعلانات المدمجة مع المحتوى داخل عرض الإعلانات القائمة المنسدلة:

ويظهر كل رقم تعريف مخصّص لشكل الإعلان المدمج مع المحتوى بجانب اسمه. يؤدي النقر على أحد تظهر لك شاشة تفاصيل تعرض معلومات عن تنسيق الحقول:

من هنا، يمكن إضافة حقول فردية وتعديلها وإزالتها. لاحظ اسم كل مادة عرض الاسم هو المفتاح المستخدم للحصول على بيانات كل مادة عرض عند عرض شكل الإعلان المدمج المخصص

عرض أشكال إعلان مدمج مخصصة

تختلف أشكال الإعلانات المدمجة المخصصة عن الأشكال التي يحددها النظام من حيث أن الناشرين القدرة على تحديد قائمة الأصول التي تؤدي إلى لعرض إعلان. وبالتالي، تختلف عملية عرض البيانات عن عملية تحديد النظام بتنسيقات متعددة:

  1. لأنّ الفئة NativeCustomFormatAd مخصّصة للتعامل مع أي من أشكال الإعلانات المدمجة المخصصة التي تحددها في "مدير الإعلانات"، وهي غير محددة "getters" عن الأصول. بدلاً من ذلك، فإنها تقدّم طرقًا مثل getText getImage تأخذ اسم الحقل كمَعلمة.
  2. لا توجد فئة مخصصة لعرض الإعلانات مثل NativeAdView لاستخدامها مع NativeCustomFormatAd لك مطلق الحرية في استخدام أي تخطيط يجعله تجربة المستخدم الخاص بك.
  3. ليس عليك التسجيل بسبب عدم توفّر صف 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) التي تمت المحاولة معها بالترتيب التالي:

  1. استدعِ OnCustomClickListener من AdLoader، إذا تم توفير واحد.
  2. بالنسبة إلى كل عنوان من عناوين URL لروابط صفحات التطبيق في الإعلان، حاوِل العثور على أداة تحليل محتوى. وتبدأ النوع الأول الذي يتم حله.
  3. افتح متصفحًا وانتقل إلى عنوان 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 لتتبع الجهات الخارجية التي تم تعيينها الإبداعية، على سبيل المثال، والتعامل مع المهام الأخرى وراء الكواليس، دون تعليمة برمجية إضافية.