Arka planda işitsel reklam oynatma

Bu kılavuz, Android uygulamalarına işitsel reklam yüklemek isteyen yayıncılara yöneliktir.

Ön koşullar

  • IMA Android SDK 3.16.1 veya sonraki sürümler.

Şu anda bir ses çalar uygulaması yoksa yayıncıların başlangıç noktası olarak github'daki Ses Çalar Örneği'ne bakmalarını öneririz. Bu örnekte, ön plan oynatıcı olarak ExoPlayer kullanılmıştır. Bu kılavuzun geri kalanında, IMA reklamlarının arka planda sesli oynatılması için gereken özellikler açıklanmaktadır.

Uygulamanıza arka planda reklam oynatma özelliği ekleme

Uygulama arka plan modundayken müzik ve işitsel reklam oynatmanın devam etmesi için özel ses çalar ve reklam yükleyici içeren bir Service bileşeni oluşturabilirsiniz.

Uygulamanızda ses çalma için bir MainActivity ve AudioPlayerService varsa AndroidManifest.xml dosyanızı aşağıda gösterildiği gibi değiştirebilirsiniz:

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

Bu hizmette, IMA SDK ile etkileşim kurmak için VideoAdPlayer arayüzünü uyguladığı sürece herhangi bir medya oynatıcı olabilecek özel bir ses oynatıcı oluşturabilirsiniz.

IMA SDK 3.16.1 sürümü, bir reklam yükleyicinin işitsel reklam istemesi için özel bir kapsayıcı oluşturmak amacıyla yeni bir işlev (createAudioAdDisplayContainer) ekledi.

Aşağıdaki kod snippet'inde, işitsel reklam isteklerini başlatmak ve yapmak için bir AudioPlayerService örneği gösterilmektedir.

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

Reklamları tamamlayıcı reklam alanlarıyla kullanma

Reklamları, tamamlayıcı reklam alanları olan veya olmayan reklamlar başlatabilirsiniz. Tamamlayıcı reklamlar oluşturmayı seçerseniz aşağıda gösterildiği gibi, bir hizmet bağlayıcısı aracılığıyla MainActivity sınıfına AudioPlayerService erişimi sağlamanız gerekir:

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() işlevini çağırabilir ve MainActivity sınıfından reklamları başlatırken tamamlayıcı banner reklamlar oluşturmak için bir kullanıcı arayüzü kapsayıcısı aktarabilirsiniz.

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

Sorunla karşılaşırsanız uygulamanızı Ses Çalar Örneği ile karşılaştırabilirsiniz. Arka planda işitsel reklam oynatma hakkında daha ayrıntılı sorularınız için IMA SDK forumunu ziyaret ederek destek alabilirsiniz.