백그라운드 오디오 광고 재생

이 가이드는 Android 앱에 오디오 광고를 로드하는 데 관심이 있는 게시자를 대상으로 합니다.

기본 요건

  • IMA Android SDK v. 3.16.1 이상

현재 오디오 플레이어 앱이 없는 경우 게시자는 github의 오디오 플레이어 예시를 시작점으로 보는 것이 좋습니다. 이 예에서는 ExoPlayer를 포그라운드 플레이어로 사용합니다. 이 가이드의 나머지 부분에서는 IMA 광고의 백그라운드 오디오 재생에 필요한 기능을 설명합니다.

앱에 백그라운드 광고 재생 추가

앱이 백그라운드 모드일 때 음악 및 오디오 광고 재생이 계속되도록 하려면 맞춤 오디오 플레이어와 광고 로더가 포함된 Service 구성요소를 만들 수 있습니다.

앱에 오디오 재생을 위한 MainActivityAudioPlayerService가 있는 경우 아래와 같이 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>

서비스에서 맞춤 오디오 플레이어를 만들 수 있습니다. 맞춤 오디오 플레이어는 IMA SDK와 상호작용하기 위한 VideoAdPlayer 인터페이스도 구현하는 한 어떤 미디어 플레이어든 될 수 있습니다.

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

컴패니언 광고 슬롯을 사용한 광고

컴패니언 광고 슬롯 유무와 관계없이 광고를 초기화할 수 있습니다. 호환 광고를 렌더링하려면 아래와 같이 서비스 바인더를 통해 AudioPlayerServiceMainActivity 클래스 액세스를 제공해야 합니다.

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

MainActivity 클래스에서 광고를 초기화할 때 addCompanionAdSlot() 함수를 호출하고 호환 배너 광고를 렌더링하기 위한 UI 컨테이너를 전달할 수 있습니다.

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 포럼에서 지원을 요청하세요.