تبلیغات بنری

تبلیغات بنری، تبلیغات مستطیلی هستند که بخشی از طرح‌بندی برنامه را اشغال می‌کنند. بنرهای تطبیقی ​​لنگر، تبلیغاتی با نسبت ابعاد ثابت هستند که در حالی که کاربران در حال تعامل با برنامه هستند، روی صفحه می مانند، چه در بالا یا پایین صفحه نمایش لنگر انداخته شوند.

این راهنما بارگذاری یک بنر تبلیغاتی تطبیقی ​​را در یک برنامه اندرویدی پوشش می‌دهد.

پیش نیازها

همیشه با تبلیغات آزمایشی تست کنید

هنگام ساخت و آزمایش برنامه های خود، مطمئن شوید که از تبلیغات آزمایشی به جای تبلیغات زنده و تولیدی استفاده می کنید. عدم انجام این کار می تواند منجر به تعلیق حساب شما شود.

ساده ترین راه برای بارگیری تبلیغات آزمایشی استفاده از شناسه واحد آگهی آزمایشی اختصاصی ما برای بنرهای اندروید است:

ca-app-pub-3940256099942544/9214589741

این به طور ویژه پیکربندی شده است تا تبلیغات آزمایشی را برای هر درخواست بازگرداند، و می‌توانید هنگام کدنویسی، آزمایش و اشکال‌زدایی از آن در برنامه‌های خود استفاده کنید. فقط مطمئن شوید که قبل از انتشار برنامه خود، آن را با شناسه واحد تبلیغاتی خود جایگزین کنید.

برای اطلاعات بیشتر درباره نحوه عملکرد تبلیغات آزمایشی SDK (بتا) Google Mobile Ads، به فعال کردن تبلیغات آزمایشی مراجعه کنید.

نمای تبلیغ را تعریف کنید

طرح بندی XML

یک نمای به فایل 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">

  <FrameLayout
      android:id="@+id/banner_view_container"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      app:layout_constraintBottom_toBottomOf="parent"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintStart_toStartOf="parent">

  </FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Jetpack Compose

یک عنصر AndroidView در رابط کاربری Compose وارد کنید و یک متغیر mutableStateOf<BannerAd?> برای نگهداری بنر تبلیغاتی تعریف کنید:

// Initialize required variables.
val context = LocalContext.current
var bannerAdState by remember { mutableStateOf<BannerAd?>(null) }

// The AdView is placed at the bottom of the screen.
Column(modifier = modifier.fillMaxSize(), verticalArrangement = Arrangement.Bottom) {
  bannerAdState?.let { bannerAd ->
    Box(modifier = Modifier.fillMaxWidth()) {
      // Display the ad within an AndroidView.
      AndroidView(
        modifier = modifier.wrapContentSize(),
        factory = { bannerAd.getView(requireActivity()) },
      )
    }
  }
}

یک تبلیغ را بارگیری کنید

  1. یک شی BannerAdRequest با شناسه واحد تبلیغات و اندازه آگهی تطبیقی ​​لنگردار ایجاد کنید.
  2. BannerAd.load() را فراخوانی کنید.
  3. BannerAd.getView() را به سلسله مراتب view اضافه کنید.

کاتلین

import com.google.android.libraries.ads.mobile.sdk.banner.AdSize
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAd
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdEventCallback
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRefreshCallback
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRequest
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError

class MainActivity : Activity() {

  private var bannerAd: BannerAd? = null
  private lateinit var binding: ActivityMainBinding
  private lateinit var adSize: AdSize
  private lateinit var bannerViewContainer: FrameLayout

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    // 320 is a placeholder value. Replace 320 with your banner container width.
    adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, 320)

    // Give the banner container a placeholder height to avoid a sudden layout
    // shifts when the ad loads.
    bannerViewContainer = binding.bannerViewContainer
    val bannerLayoutParams = bannerViewContainer.layoutParams
    bannerLayoutParams.height = adSize.getHeightInPixels(requireContext())
    bannerViewContainer.layoutParams = bannerLayoutParams

    // Step 1 - Create a BannerAdRequest object with ad unit ID and size.
    val adRequest = BannerAdRequest.Builder("ca-app-pub-3940256099942544/9214589741", adSize).build()

    // Step 2 - Load the ad.
    BannerAd.load(
      adRequest,
      object : AdLoadCallback<BannerAd> {
        override fun onAdLoaded(ad: BannerAd) {
          // Assign the loaded ad to the BannerAd object.
          bannerAd = ad
          // Step 3 - Call BannerAd.getView() to get the View and add it
          // to view hierarchy on the UI thread.
          activity?.runOnUiThread {
            binding.bannerViewContainer.addView(ad.getView(requireActivity()))
          }
        }

        override fun onAdFailedToLoad(loadAdError: LoadAdError) {
          bannerAd = null
        }
      },
    )
  }
}

جاوا

import com.google.android.libraries.ads.mobile.sdk.banner.AdSize;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAd;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdEventCallback;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRefreshCallback;
import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRequest;
import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback;
import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError;

public class MainActivity extends AppCompatActivity {

  private BannerAd bannerAd;
  private ActivityMainBinding binding;
  private AdSize adSize;
  private FrameLayout bannerViewContainer;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

    // 320 is a placeholder value. Replace 320 with your banner container width.
    adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(this, 320);

    // Give the banner container a placeholder height to avoid a sudden layout
    // shifts when the ad loads.
    bannerViewContainer = binding.bannerViewContainer;
    LayoutParams bannerLayoutParams = bannerViewContainer.getLayoutParams();
    bannerLayoutParams.height = adSize.getHeightInPixels(this);
    bannerViewContainer.setLayoutParams(bannerLayoutParams);

    // Step 1 - Create a BannerAdRequest object with ad unit ID and size.
    BannerAdRequest adRequest = new BannerAdRequest.Builder("ca-app-pub-3940256099942544/9214589741",
        adSize).build();

    // Step 2 - Load the ad.
    BannerAd.load(
        adRequest,
        new AdLoadCallback<BannerAd>() {
          @Override
          public void onAdLoaded(@NonNull BannerAd ad) {
            // Assign the loaded ad to the BannerAd object.
            bannerAd = ad;
            // Step 3 - Call BannerAd.getView() to get the View and add it
            // to view hierarchy on the UI thread.
            runOnUiThread(
                () -> binding.bannerViewContainer.addView(ad.getView(MainActivity.this)));
          }

          @Override
          public void onAdFailedToLoad(@NonNull LoadAdError adError) {
            bannerAd = null;
          }
        });
  }
}

Jetpack Compose

// Request an anchored adaptive banner with a width of 360.
val adSize = AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(requireContext(), 360)

// Load the ad when the screen is active.
val coroutineScope = rememberCoroutineScope()
val isPreviewMode = LocalInspectionMode.current
LaunchedEffect(context) {
  bannerAdState?.destroy()
  if (!isPreviewMode) {
    coroutineScope.launch {
      when (val result = BannerAd.load(BannerAdRequest.Builder(AD_UNIT_ID, adSize).build())) {
        is AdLoadResult.Success -> {
          bannerAdState = result.ad
        }
        is AdLoadResult.Failure -> {
          showToast("Banner failed to load.")
          Log.w(Constant.TAG, "Banner ad failed to load: $result.error")
        }
      }
    }
  }
}

یک آگهی را تازه کنید

اگر واحد تبلیغات خود را برای بازخوانی پیکربندی کرده‌اید، نیازی به درخواست آگهی دیگری در صورت عدم بارگیری آگهی ندارید. Google Mobile Ads SDK (بتا) به نرخ تازه‌سازی که در رابط کاربری AdMob مشخص کرده‌اید احترام می‌گذارد. اگر بازخوانی را فعال نکرده‌اید، درخواست جدیدی صادر کنید. برای جزئیات بیشتر در مورد بازخوانی واحد تبلیغات، مانند تنظیم نرخ تجدید، به استفاده از بازخوانی خودکار برای تبلیغات بنر مراجعه کنید.

یک منبع تبلیغاتی منتشر کنید

پس از اتمام استفاده از بنر تبلیغاتی، می توانید منابع تبلیغات بنری را آزاد کنید.

برای انتشار منبع تبلیغ، تبلیغ را از سلسله مراتب مشاهده حذف می‌کنید و همه مراجع آن را حذف می‌کنید:

کاتلین

// 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

جاوا

// Remove banner from view hierarchy.
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 Compose


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

رویدادهای تبلیغاتی

می‌توانید به تعدادی از رویدادها در چرخه عمر آگهی گوش دهید، از جمله نمایش و کلیک آگهی، و همچنین باز و بسته شدن آگهی. توصیه می شود قبل از نمایش بنر، تماس برگشتی را تنظیم کنید.

کاتلین

BannerAd.load(
  BannerAdRequest.Builder("ca-app-pub-3940256099942544/9214589741", adSize).build(),
  object : AdLoadCallback<BannerAd> {
    override fun onAdLoaded(ad: BannerAd) {
      ad.adEventCallback =
        object : BannerAdEventCallback {
          override fun onAdImpression() {
            // Banner ad recorded an impression.
          }

          override fun onAdClicked() {
            // Banner ad recorded a click.
          }

          override fun onAdShowedFullScreenContent() {
            // Banner ad showed.
          }

          override fun onAdDismissedFullScreenContent() {
            // Banner ad dismissed.
          }

          override fun onAdFailedToShowFullScreenContent(
            fullScreenContentError: FullScreenContentError
          ) {
            // Banner ad failed to show.
          }
        }
    }
    // ...
  }
)

جاوا

BannerAd.load(
    new BannerAdRequest.Builder("ca-app-pub-3940256099942544/9214589741", adSize).build(),
    new AdLoadCallback<BannerAd>() {
      @Override
      public void onAdLoaded(@NonNull BannerAd ad) {
        ad.setAdEventCallback(new BannerAdEventCallback() {
          @Override
          public void onAdImpression() {
            // Banner ad recorded an impression.
          }

          @Override
          public void onAdClicked() {
            // Banner ad recorded a click.
          }

          @Override
          public void onAdShowedFullScreenContent() {
            // Banner ad showed.
          }

          @Override
          public void onAdDismissedFullScreenContent() {
            // Banner ad dismissed.
          }

          @Override
          public void onAdFailedToShowFullScreenContent(
              @NonNull FullScreenContentError fullScreenContentError) {
            // Banner ad failed to show.
          }
        });

        // ...
      }
    });

بازخوانی آگهی بازخوانی

اگر از بازخوانی خودکار برای تبلیغات بنری استفاده می کنید، BannerAdRefreshCallback رویدادهای تازه سازی آگهی را مدیریت می کند. قبل از اینکه نمای تبلیغاتی را به سلسله مراتب مشاهده خود اضافه کنید، حتماً پاسخ تماس را تنظیم کنید. برای جزئیات بیشتر در مورد بازخوانی آگهی، به تازه کردن آگهی مراجعه کنید.

کاتلین

BannerAd.load(
  BannerAdRequest.Builder("ca-app-pub-3940256099942544/9214589741", adSize).build(),
  object : AdLoadCallback<BannerAd> {
    override fun onAdLoaded(ad: BannerAd) {
      ad.bannerAdRefreshCallback =
        object : BannerAdRefreshCallback {
          // Set the ad refresh callbacks.
          override fun onAdRefreshed() {
            // Called when the ad refreshes.
          }

          override fun onAdFailedToRefresh(loadAdError: LoadAdError) {
            // Called when the ad fails to refresh.
          }
        }

      // ...
    }
  }
)

جاوا

BannerAd.load(
    new BannerAdRequest.Builder("ca-app-pub-3940256099942544/9214589741", adSize).build(),
    new AdLoadCallback<BannerAd>() {
      @Override
      public void onAdLoaded(@NonNull BannerAd ad) {
        ad.setBannerAdRefreshCallback(
            // Set the ad refresh callbacks.
            new BannerAdRefreshCallback() {
              @Override
              public void onAdRefreshed() {
                // Called when the ad refreshes.
              }

              @Override
              public void onAdFailedToRefresh(@NonNull LoadAdError adError) {
                // Called when the ad fails to refresh.
              }
            });
        // ...
      }
    });

شتاب سخت افزاری برای تبلیغات ویدیویی

برای اینکه تبلیغات ویدیویی با موفقیت در بازدیدهای تبلیغات بنری شما نمایش داده شود، شتاب سخت افزاری باید فعال باشد.

شتاب سخت‌افزاری به‌طور پیش‌فرض فعال است، اما برخی از برنامه‌ها ممکن است آن را غیرفعال کنند. اگر این مورد در مورد برنامه شما صدق می کند، توصیه می کنیم شتاب سخت افزاری را برای کلاس های 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>

برای اطلاعات بیشتر درباره گزینه‌های کنترل شتاب سخت‌افزار، راهنمای شتاب سخت‌افزار را ببینید. توجه داشته باشید که در صورت غیرفعال شدن فعالیت، نماهای تبلیغاتی منفرد را نمی توان برای شتاب سخت افزاری فعال کرد، بنابراین خود فعالیت باید شتاب سخت افزاری را فعال کند.

برنامه مثالی را که استفاده از Google Mobile Ads SDK (بتا) را نشان می دهد، دانلود و اجرا کنید.