Dieser Leitfaden richtet sich an Publisher, die Audioanzeigen in ihre Android-Apps laden möchten.
Voraussetzungen
- IMA Android SDK Version 3.16.1 oder höher.
Wir empfehlen Publishern, sich das Audioplayer-Beispiel auf GitHub als Ausgangspunkt anzusehen, wenn sie noch keine Audioplayer-App haben. In diesem Beispiel wird ExoPlayer als Player im Vordergrund verwendet. Im weiteren Verlauf dieses Leitfadens werden die Funktionen beschrieben, die für die Audiowiedergabe von IMA-Anzeigen im Hintergrund erforderlich sind.
Ihrer App die Wiedergabe von Hintergrundanzeigen hinzufügen
Damit die Wiedergabe von Musik- und Audioanzeigen fortgesetzt wird, wenn die App im Hintergrundmodus ausgeführt wird, können Sie eine Service
-Komponente erstellen, die einen benutzerdefinierten Audioplayer und ein Anzeigenladeprogramm enthält.
Wenn deine App ein MainActivity
und ein AudioPlayerService
für die Audiowiedergabe hat, kannst du deine 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>
Mit diesem Dienst können Sie einen benutzerdefinierten Audioplayer erstellen. Das kann ein beliebiger Mediaplayer sein. Er muss außerdem die Schnittstelle VideoAdPlayer
für die Interaktion mit dem IMA SDK implementieren.
In Version 3.16.1 des IMA SDK wurde die neue Funktion createAudioAdDisplayContainer
hinzugefügt, um einen speziellen Container für ein Adloader zu erstellen, mit dem Audioanzeigen angefordert werden.
Im folgenden Code-Snippet sehen Sie ein Beispiel für den AudioPlayerService
zum Initialisieren und Ausführen von Audioanzeigenanfragen.
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 Companion-Anzeigenflächen initialisieren. Wenn Sie Companion-Anzeigen rendern möchten, müssen Sie den Zugriff der AudioPlayerService
auf die Klasse MainActivity
über ein Dienstbinder wie unten gezeigt gewähren:
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 zum 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);
}
...
}
Du kannst deine Implementierung mit dem Beispiel für einen Audioplayer vergleichen, falls ein Problem auftritt. Bei weiteren Fragen zur Wiedergabe von Audioanzeigen im Hintergrund wenden Sie sich bitte an das IMA SDK-Forum.