תמיכה במודעות אודיו ברקע

המדריך הזה מיועד לבעלי אפליקציות שרוצים לטעון מודעות אודיו באפליקציות שלהם ל-Android.

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

  • ‫IMA Android SDK גרסה 3.16.1 ואילך.

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

הוספת הפעלה ברקע של מודעות לאפליקציה

כדי שההפעלה של מודעות מוזיקה ואודיו תימשך כשהאפליקציה פועלת ברקע, אפשר ליצור רכיב Service שמכיל נגן אודיו בהתאמה אישית וטוען מודעות.

אם באפליקציה יש MainActivity ו-AudioPlayerService להפעלת אודיו, אפשר לשנות את קובץ AndroidManifest.xml כמו בדוגמה הבאה:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="…">
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
  <application  >
    <activity android:name=".MainActivity" android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
    <service android:name=".AudioPlayerService"
             android:exported="false"/>
  </application>
</manifest>

בשירות, אפשר ליצור נגן אודיו בהתאמה אישית, שיכול להיות כל נגן מדיה, כל עוד הוא גם מטמיע את הממשק VideoAdPlayer לצורך אינטראקציה עם IMA SDK.

ב-IMA SDK גרסה 3.16.1 נוספה פונקציה חדשה, createAudioAdDisplayContainer, ליצירת מאגר מיוחד לטעינת מודעות, כדי לבקש מודעות אודיו.

בקטע הקוד הבא מוצגת דוגמה לשימוש ב-AudioPlayerService לאתחול ולשליחת בקשות למודעות אודיו.

import android.app.Service;

import com.google.ads.interactivemedia.v3.api.AdDisplayContainer;
import com.google.ads.interactivemedia.v3.api.AdsLoader;
import com.google.ads.interactivemedia.v3.api.AdsRequest;
import com.google.ads.interactivemedia.v3.api.CompanionAdSlot;
import com.google.ads.interactivemedia.v3.api.ImaSdkFactory;
import com.google.ads.interactivemedia.v3.api.ImaSdkSettings;
import com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer;

import com.google.common.collect.ImmutableList;

/** Plays music and ads even when the app enters background mode. */
public class AudioPlayerService extends Service {

  /**
   * A custom audio player that implements the `VideoAdPlayer` interface.
   */
  private VideoAdPlayer audioPlayer;

  /**
   * An object to create other SDK objects: `AdDisplayContainer`, `AdsLoader` and `AdRequest`.
   */
  private ImaSdkFactory sdkFactory;

  /**
   * An object to make ad requests that would return an `AdsManager`.
   */
  private AdsLoader adsLoader;

  /**
   * An optional list of ViewGroup for rendering companion banners.
   */
  private ImmutableList<CompanionAdSlot> companionAdSlots;

  /**
   * Creates an AdsLoader for requesting ads and handling ad events.
   */
  public void initializeAds() {
    sdkFactory = ImaSdkFactory.getInstance();
    ImaSdkSettings imaSdkSettings = ImaSdkFactory.getInstance().createImaSdkSettings();
    AdDisplayContainer container = ImaSdkFactory.createAudioAdDisplayContainer(this, audioPlayer);
    if (companionAdSlots != null) {
      container.setCompanionSlots(companionAdSlots);
    }
    adsLoader = sdkFactory.createAdsLoader(this, imaSdkSettings, container);

    // Adds event handling logic for ads.
    // For more details, see
    // https://developers.google.com/interactive-media-ads/docs/sdks/android#create-an-adsloader
    adsLoader.addAdsLoadedListener();
    adsLoader.addAdErrorListener();
  }

  /**
   * Adds a companion ad slot. This slot is not required but can be set in ads initialization.
   *
   * @param companionAdSlot UI container for rendering companion banners.
   */
  public void addCompanionAdSlot(CompanionAdSlot companionAdSlot) {
    this.companionAdSlots = ImmutableList.of(companionAdSlot);
  }

  /**
   * Makes an audio ad request.
   *
   * @param adTagUrl Url to download an ad tag.
   */
  public void requestAd(String adTagUrl) {
    AdsRequest request = sdkFactory.createAdsRequest();
    request.setAdTagUrl(adTagUrl);
    adsLoader.requestAds(request);
  }
  ...
}

שימוש במודעות עם משבצות למודעות נלוות

אפשר להפעיל מודעות עם או בלי משבצות למודעות נלוות. אם בוחרים להציג מודעות נלוות, צריך לספק גישה ל-AudioPlayerService למחלקה MainActivity באמצעות קובץ שירות, כמו שמוצג בהמשך:

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

import androidx.annotation.Nullable;
...
/** Plays music and ads even when the app enters background mode. */
public class AudioPlayerService extends Service {
  ...
  @Nullable
  @Override
  public IBinder onBind(Intent intent) {
    return new ServiceBinder(this);
  }

  /**
   * Provides access to the `AudioPlayerService` instance after binding.
   */
  public class ServiceBinder extends Binder {
    private final AudioPlayerService boundService;

    /**
     * @param service The bound instance of the service
     */
    public ServiceBinder(AudioPlayerService service) {
      boundService = service;
    }

    public AudioPlayerService getBoundService() {
      return boundService;
    }
  }
}

אפשר לקרוא לפונקציה addCompanionAdSlot() ולהעביר מאגר של רכיבי ממשק משתמש כדי לעבד מודעות באנר משולבות כשמפעילים מודעות מהמחלקה MainActivity.

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.ViewGroup;

import com.google.ads.interactivemedia.v3.api.CompanionAdSlot;
import com.google.ads.interactivemedia.v3.api.ImaSdkFactory;

public class MainActivity extends Activity {

  private AudioPlayerService boundService;
  private ServiceConnection connection;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    ImaSdkFactory sdkFactory = ImaSdkFactory.getInstance();

    ViewGroup companionView = findViewById(R.id.companionAdSlotFrame);
    final CompanionAdSlot companionAdSlot = sdkFactory.createCompanionAdSlot();
    companionAdSlot.setContainer(companionView);
    companionAdSlot.setSize(640, 640);

    connection =
        new ServiceConnection() {
          @Override
          public void onServiceConnected(ComponentName name, IBinder binder) {
            boundService = ((AudioPlayerService.ServiceBinder) binder).getBoundService();
            boundService.addCompanionAdSlot(companionAdSlot);
            boundService.initializeAds();
          }
          ...
        };
    ...
    bindService(intent, connection, Context.BIND_AUTO_CREATE);
  }
  ...
}

אם נתקלתם בבעיה, תוכלו להשוות את ההטמעה שלכם עם הדוגמה של נגן אודיו. לשאלות נוספות בנושא הפעלת מודעות אודיו ברקע, אפשר לפנות לפורום IMA SDK לקבלת תמיכה.