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

המדריך הזה מיועד לבעלי תוכן דיגיטלי שרוצים לטעון מודעות אודיו לאפליקציות שלהם ל-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 לקבלת תמיכה.