הגדרת מודעות באנר

מודעות באנר הן מודעות מלבניות שתופסות חלק מהפריסה של האפליקציה. מודעות באנר מותאמות ומעוגנות הן מודעות עם יחס גובה-רוחב קבוע שמוצגות במסך גם בזמן אינטראקציות של המשתמשים באפליקציה – מעוגנות בראש המסך או בתחתית המסך.

במדריך הזה מוסבר איך לטעון מודעת באנר מותאמת ומעוגנת באפליקציית Android.

דרישות מוקדמות

תמיד צריך לבדוק באמצעות מודעות בדיקה

כשאתם מפתחים ובודקים את האפליקציות, חשוב להשתמש במודעות בדיקה ולא במודעות פעילות. אחרת, אנחנו עלולים להשעות את החשבון.

הדרך הכי קלה לטעון מודעות לבדיקה היא להשתמש במזהה יחידת המודעות הייעודי לבדיקה של מודעות באנר ב-Android:

/21775744923/example/adaptive-banner

הוא הוגדר במיוחד כדי להחזיר לכל בקשה מודעות בדיקה, ואפשר להשתמש בו באפליקציות שלכם בזמן כתיבת קוד, בדיקה וניפוי באגים. רק חשוב להחליף אותו במזהה יחידת המודעות שלכם לפני שאתם מפרסמים את האפליקציה.

מידע נוסף על אופן הפעולה של מודעות בדיקה ב-GMA Next-Gen SDK זמין במאמר הפעלת מודעות בדיקה.

יצירת אובייקט AdView

כדי להציג באנרים, מבצעים את הפעולות הבאות:

Kotlin

  1. יוצרים אובייקט AdView.
  2. מוסיפים את האובייקט AdView לפריסה של האפליקציה.

בדוגמה הבאה נוצר האובייקט AdView והוא מתווסף לפריסת האפליקציה:

private fun createAdView(adViewContainer: FrameLayout, activity: Activity) {
  val adView = AdView(activity)
  adViewContainer.addView(adView)
}

Java

  1. יוצרים אובייקט AdView.
  2. מוסיפים את האובייקט AdView לפריסה של האפליקציה.

בדוגמה הבאה נוצר האובייקט AdView והוא מתווסף לפריסת האפליקציה:

private void createAdView(FrameLayout adViewContainer, Activity activity) {
  AdView adView = new AdView(activity);
  adViewContainer.addView(adView);
}

פריסת XML

מוסיפים רכיב AdView לקובץ ה-XML של הפריסה:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <com.google.android.libraries.ads.mobile.sdk.banner.AdView
      android:id="@+id/adView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Jetpack פיתוח נייטיב

  1. יוצרים אובייקט AdView בתוך בלוק remember.
  2. מוסיפים רכיב AndroidView בממשק המשתמש של Compose כדי להציג את האובייקט AdView:
val context = LocalContext.current
val adView = remember { AdView(context) }

// The AdView is placed at the bottom of the screen.
Column(modifier = modifier.fillMaxSize(), verticalArrangement = Arrangement.Bottom) {
  Box(modifier = modifier.fillMaxWidth()) {
    // Display the ad within an AndroidView.
    AndroidView(modifier = modifier.wrapContentSize(), factory = { adView })
  }
}

טעינת מודעה

בדוגמה הבאה, מודעת באנר מותאמת ומעוגנת ברוחב 360 נטענת לאובייקט AdView:

Kotlin

private fun loadBannerAd(adView: AdView, activity: Activity) {
  // Get a BannerAdRequest for a 360 wide large anchored adaptive banner ad.
  val adSize = AdSize.getLargeAnchoredAdaptiveBannerAdSize(activity, 360)
  val adRequest = BannerAdRequest.Builder(AD_UNIT_ID, adSize).build()

  adView.loadAd(
    adRequest,
    object : AdLoadCallback<BannerAd> {
      override fun onAdLoaded(ad: BannerAd) {
        Log.d(TAG, "Banner ad loaded.")
      }

      override fun onAdFailedToLoad(adError: LoadAdError) {
        Log.d(TAG, "Banner ad failed to load: $adError")
      }
    },
  )
}

Java

private void loadBannerAd(AdView adView, Activity activity) {
  // Get a BannerAdRequest for a 360 wide large anchored adaptive banner ad.
  AdSize adSize = AdSize.getLargeAnchoredAdaptiveBannerAdSize(activity, 360);
  BannerAdRequest adRequest = new BannerAdRequest.Builder(AD_UNIT_ID, adSize).build();

  adView.loadAd(
      adRequest,
      new AdLoadCallback<BannerAd>() {
        @Override
        public void onAdLoaded(@NonNull BannerAd bannerAd) {
          Log.d(TAG, "Banner ad loaded.");
        }

        @Override
        public void onAdFailedToLoad(@NonNull LoadAdError adError) {
          Log.d(TAG, "Banner ad failed to load: " + adError);
        }
      });
}

Jetpack פיתוח נייטיב

// Request a large anchored adaptive banner with a width of 360.
val adSize = AdSize.getLargeAnchoredAdaptiveBannerAdSize(context, 360)

// Load the ad when the screen is active.
val isPreviewMode = LocalInspectionMode.current
LaunchedEffect(adSize) {
  if (!isPreviewMode) {
    val adRequest = BannerAdRequest.Builder(AD_UNIT_ID, adSize).build()
    adView.loadAd(
      adRequest,
      object : AdLoadCallback<BannerAd> {
        override fun onAdLoaded(ad: BannerAd) {
          Log.d(Constant.TAG, "Banner ad loaded.")
        }

        override fun onAdFailedToLoad(adError: LoadAdError) {
          Log.w(Constant.TAG, "Banner ad failed to load: $adError")
        }
      },
    )
  }
}

צריך להגדיר גודל מודעה שקטן מגודל המסך של המכשיר או שווה לו. כדי לקבוע את גודל המסך המקסימלי, משתמשים ב-method‏ Resources.getDisplayMetrics. המידות של האובייקט AdSize מוגדרות בפיקסלים שלא תלויים בדחיסות (dp). כשמשווים, צריך להמיר את גודל המסך מפיקסלים ל-dp. פרטים על מגבלות הגודל מופיעים במאמר בנושא פתרון בעיות שקשורות לחשיפות שלא מולאו ב-Ad Manager.

רענון מודעה

אם הגדרתם את יחידת המודעות לרענון, אתם לא צריכים לבקש מודעה אחרת כשהמודעה לא נטענת. ‫GMA Next-Gen SDK מכבד את קצב הרענון שציינתם בממשק המשתמש של Ad Manager. אם לא הפעלתם את הרענון, שלחו בקשה חדשה. פרטים נוספים על רענון יחידות מודעות, כמו הגדרת קצב רענון, זמינים במאמר קצב רענון של מודעות באפליקציות לנייד.

שחרור משאב של מודעה

כשמסיימים להשתמש במודעת באנר, אפשר לשחרר את המשאבים של מודעת הבאנר.

כדי לשחרר את המשאב של המודעה, מסירים את המודעה מהיררכיית התצוגות ומבטלים את כל ההפניות אליה:

Kotlin

private fun destroyBanner() {
  // Remove banner from view hierarchy.
  val parentView = adView?.parent
  if (parentView is ViewGroup) {
    parentView.removeView(adView)
  }

  // Destroy the banner ad resources.
  adView?.destroy()

  // Drop reference to the banner ad.
  adView = null
}

Java

private void destroyBanner() {
  // Remove banner from view hierarchy.
  if (adView != null) {
    if (adView.getParent() instanceof ViewGroup) {
      ((ViewGroup) adView.getParent()).removeView(adView);
    }

    // Destroy the banner ad resources.
    adView.destroy();
  }

  // Drop reference to the banner ad.
  adView = null;
}

Jetpack פיתוח נייטיב

// Destroy the ad when the screen is disposed.
DisposableEffect(Unit) { onDispose { adView.destroy() } }

אירועי מודעות

אפשר להאזין למספר אירועים במחזור החיים של המודעה, כולל חשיפה וקליק של המודעה, וגם פתיחה וסגירה של המודעה. מומלץ להגדיר את הקריאה החוזרת לפני הצגת המודעה.

Kotlin

override fun onAdLoaded(ad: BannerAd) {
  ad.adEventCallback =
    object : BannerAdEventCallback {
      override fun onAdImpression() {
        // Banner ad recorded an impression.
        Log.d(TAG, "Banner ad recorded an impression.")
      }

      override fun onAdClicked() {
        // Banner ad recorded a click.
        Log.d(TAG, "Banner ad clicked.")
      }

      override fun onAdShowedFullScreenContent() {
        // Banner ad showed.
        Log.d(TAG, "Banner ad showed full screen content.")
      }

      override fun onAdDismissedFullScreenContent() {
        // Banner ad dismissed.
        Log.d(TAG, "Banner ad dismissed full screen content.")
      }

      override fun onAdFailedToShowFullScreenContent(
        fullScreenContentError: FullScreenContentError
      ) {
        // Banner ad failed to show.
        Log.w(TAG, "Banner ad failed to show full screen content: $fullScreenContentError")
      }
    }
}

Java

@Override
public void onAdLoaded(@NonNull BannerAd bannerAd) {
  bannerAd.setAdEventCallback(
      new BannerAdEventCallback() {
        @Override
        public void onAdImpression() {
          // Banner ad recorded an impression.
          Log.d(TAG, "Banner ad recorded an impression.");
        }

        @Override
        public void onAdClicked() {
          // Banner ad recorded a click.
          Log.d(TAG, "Banner ad clicked.");
        }

        @Override
        public void onAdShowedFullScreenContent() {
          // Banner ad showed.
          Log.d(TAG, "Banner ad showed full screen content.");
        }

        @Override
        public void onAdDismissedFullScreenContent() {
          // Banner ad dismissed.
          Log.d(TAG, "Banner ad dismissed full screen content.");
        }

        @Override
        public void onAdFailedToShowFullScreenContent(
            @NonNull FullScreenContentError fullScreenContentError) {
          // Banner ad failed to show.
          Log.w(
              TAG,
              "Banner ad failed to show full screen content: " + fullScreenContentError);
        }
      });
}

הממשק BannerAdEventCallback מטפל באירועים של תוכן במסך מלא באופן הבא:

  • שכבות-על באפליקציה: GMA Next-Gen SDK קריאות onAdShowedFullScreenContent וonAdDismissedFullScreenContent רק כשמודעת באנר מציגה או מסתירה שכבת-על באפליקציה, כמו מודעת מדיה עשירה מורחבת של Mobile Rich Media Ad Interface Definitions ‏ (MRAID) או שכבת-על של AdChoices.

  • ניווט חיצוני: GMA Next-Gen SDK לא קורא לשיטות האלה כשקליק על מודעה מוביל אל מחוץ לאפליקציה, למשל לדפדפן חיצוני או לזירת מסחר של אפליקציות. כדי לזהות מתי משתמש יוצא מהאפליקציה או חוזר אליה אחרי שהוא לוחץ על מודעה, צריך להאזין לאירועים במחזור החיים של האפליקציה לצד השיטה onAdClicked.

קריאה חוזרת (callback) לרענון מודעות

התג BannerAdRefreshCallback מטפל באירועי רענון של מודעות אם אתם משתמשים ברענון אוטומטי של מודעות באנר. חשוב להגדיר את הקריאה החוזרת (callback) לפני שמוסיפים את תצוגת המודעה להיררכיית התצוגות. פרטים על רענון מודעות זמינים במאמר רענון מודעה.

Kotlin

adView.loadAd(
  adRequest,
  object : AdLoadCallback<BannerAd> {
    override fun onAdLoaded(ad: BannerAd) {
      ad.bannerAdRefreshCallback =
        object : BannerAdRefreshCallback {
          override fun onAdRefreshed() {
            // Banner ad refreshed.
            Log.d(TAG, "Banner ad refreshed.")
          }

          override fun onAdFailedToRefresh(adError: LoadAdError) {
            // Banner ad failed to refresh.
            Log.w(TAG, "Banner ad failed to refresh: $adError")
          }
        }
    }

    override fun onAdFailedToLoad(adError: LoadAdError) {
      // Banner ad failed to load.
      Log.w(TAG, "Banner ad failed to load: $adError")
    }
  },
)

Java

adView.loadAd(
    adRequest,
    new AdLoadCallback<BannerAd>() {
      @Override
      public void onAdLoaded(@NonNull BannerAd bannerAd) {
        bannerAd.setBannerAdRefreshCallback(
            new BannerAdRefreshCallback() {
              @Override
              public void onAdRefreshed() {
                // Banner ad refreshed.
                Log.d(TAG, "Banner ad refreshed.");
              }

              @Override
              public void onAdFailedToRefresh(@NonNull LoadAdError adError) {
                // Banner ad failed to refresh.
                Log.w(TAG, "Banner ad failed to refresh: " + adError);
              }
            });
      }

      @Override
      public void onAdFailedToLoad(@NonNull LoadAdError adError) {
        // Banner ad failed to load.
        Log.w(TAG, "Banner ad failed to load: " + adError);
      }
    });

שיפור מהירות באמצעות חומרה במודעות וידאו

כדי שמודעות וידאו יוצגו בהצלחה בצפיות במודעות באנר, צריך להפעיל האצת חומרה.

התכונה 'שיפור מהירות באמצעות חומרה' מופעלת כברירת מחדל, אבל יכול להיות שאפליקציות מסוימות ישביתו אותה. אם זה המצב באפליקציה שלכם, מומלץ להפעיל שיפור מהירות באמצעות חומרה עבור מחלקות Activity שמשתמשות במודעות.

הפעלה של שיפור המהירות באמצעות חומרה

אם האפליקציה לא פועלת בצורה תקינה כשהאצת החומרה מופעלת באופן גלובלי, אפשר לשלוט בה גם עבור פעילויות ספציפיות. כדי להפעיל או להשבית את שיפור המהירות באמצעות חומרה, אפשר להשתמש במאפיין android:hardwareAccelerated של הרכיבים <application> ו-<activity> בקובץ AndroidManifest.xml. בדוגמה הבאה, שיפור המהירות באמצעות חומרה מופעל בכל האפליקציה, אבל מושבת בפעילות אחת:

<application android:hardwareAccelerated="true">
    <!-- For activities that use ads, hardwareAcceleration should be true. -->
    <activity android:hardwareAccelerated="true" />
    <!-- For activities that don't use ads, hardwareAcceleration can be false. -->
    <activity android:hardwareAccelerated="false" />
</application>

במדריך לשיפור מהירות באמצעות חומרה מפורט מידע נוסף על האפשרויות לשליטה בשיפור המהירות באמצעות חומרה. שימו לב שאי אפשר להפעיל שיפור מהירות באמצעות חומרה בתצוגות של מודעות בודדות אם הפעילות מושבתת, ולכן צריך להפעיל את שיפור המהירות באמצעות חומרה בפעילות עצמה.

מורידים את האפליקציה לדוגמה שמדגימה את השימוש ב-GMA Next-Gen SDK ומפעילים אותה.