Wiedergabe von Audioanzeigen im Hintergrund

Dieser Leitfaden richtet sich an Publisher, die Audioanzeigen in ihren Android-Apps laden möchten.

Vorbereitung

  • IMA Android SDK Version 3.16.1 oder höher

Wenn Publisher noch keine Audioplayer-App haben, empfehlen wir ihnen, sich das Beispiel für einen Audioplayer auf GitHub anzusehen. In diesem Beispiel wird ExoPlayer als Player im Vordergrund verwendet. Im Rest dieses Leitfadens werden die Funktionen beschrieben, die für die Hintergrundaudiowiedergabe von IMA-Anzeigen erforderlich sind.

Hintergrundwiedergabe von Anzeigen in Ihrer App hinzufügen

Damit die Wiedergabe von Musik und Audioanzeigen fortgesetzt wird, wenn die App im Hintergrundmodus ist, können Sie eine Service-Komponente mit einem benutzerdefinierten Audioplayer und einem Anzeigen-Ladeprogramm erstellen.

Wenn Ihre App eine MainActivity und eine AudioPlayerService für die Audiowiedergabe hat, können Sie die AndroidManifest.xml-Datei so ändern:

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

Im Dienst kannst du einen benutzerdefinierten Audioplayer erstellen. Das kann jeder beliebige Mediaplayer sein, solange er die VideoAdPlayer-Schnittstelle für die Interaktion mit dem IMA SDK implementiert.

Im IMA SDK 3.16.1 wurde die neue Funktion createAudioAdDisplayContainer hinzugefügt, um einen speziellen Container für einen Anzeigen-Lademechanismus zum Anfordern von Audioanzeigen zu erstellen.

Das folgende Code-Snippet zeigt ein Beispiel für die AudioPlayerService zum Initialisieren und Senden von Anfragen für Audioanzeigen.

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);
  }
  ...
}

Anzeigen mit Companion-Anzeigenflächen verwenden

Sie können Anzeigen mit oder ohne Anzeigenflächen für begleitende Anzeigen initialisieren. Wenn du Companion-Anzeigen rendern möchtest, musst du der AudioPlayerService über einen Dienst-Binder Zugriff auf die MainActivity-Klasse gewähren, wie unten dargestellt:

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;
    }
  }
}

Sie können die Funktion addCompanionAdSlot() aufrufen und einen UI-Container für das Rendern von Companion-Banneranzeigen übergeben, wenn Sie Anzeigen aus der Klasse MainActivity initialisieren.

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);
  }
  ...
}

Wenn Probleme auftreten, können Sie Ihre Implementierung mit dem Beispiel für einen Audioplayer vergleichen. Wenn du weitere Fragen zur Wiedergabe von Audioanzeigen im Hintergrund hast, kannst du dich im IMA SDK-Forum an den Support wenden.