Esta guía está dirigida a los publicadores que desean cargar anuncios de audio en sus apps para Android.
Requisitos previos
- SDK de IMA para Android 3.16.1 o versiones posteriores
Recomendamos a los publicadores que consulten el ejemplo de reproductor de audio en GitHub como punto de partida si no tienen una app de reproductor de audio. En este ejemplo, se usa ExoPlayer como reproductor en primer plano. En el resto de esta guía, se describirán las funciones necesarias para la reproducción de audio en segundo plano de los anuncios de IMA.
Cómo agregar la reproducción de anuncios en segundo plano a tu app
Para que la reproducción de música y anuncios de audio continúe cuando la app esté en modo en segundo plano, puedes crear un componente Service
que contenga un reproductor de audio personalizado y un cargador de anuncios.
Si tu app tiene un MainActivity
y un AudioPlayerService
para la reproducción de audio, puedes modificar el archivo AndroidManifest.xml
como se muestra a continuación:
<?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>
En el servicio, puedes crear un reproductor de audio personalizado, que puede ser cualquier reproductor multimedia, siempre que también implemente la interfaz VideoAdPlayer
para interactuar con el SDK de IMA.
El SDK de IMA v. 3.16.1 agregó una nueva función, createAudioAdDisplayContainer
, para crear un contenedor especializado para que un cargador de anuncios solicite anuncios de audio.
En el siguiente fragmento de código, se muestra un ejemplo de AudioPlayerService
para inicializar y realizar solicitudes de anuncios de audio.
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);
}
...
}
Cómo utilizar anuncios con posiciones de anuncios complementarios
Puedes inicializar anuncios con o sin posiciones de anuncios complementarios. Si decides renderizar anuncios complementarios, debes proporcionar acceso de AudioPlayerService
a la clase MainActivity
a través de un vinculador de servicios, como se muestra a continuación:
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;
}
}
}
Puedes llamar a la función addCompanionAdSlot()
y pasar un contenedor de IU para renderizar anuncios de banner complementarios mientras inicializas anuncios desde la clase 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);
}
...
}
Si tienes problemas, puedes comparar tu implementación con el ejemplo de reproductor de audio. Si tienes más preguntas sobre la reproducción de anuncios de audio en segundo plano, comunícate con el foro del SDK de IMA para obtener asistencia.