การเล่นโฆษณาเสียงขณะล็อกหน้าจอหรือขณะใช้แอปอื่น

คู่มือนี้มีไว้สำหรับผู้เผยแพร่โฆษณาที่สนใจโหลดโฆษณาเสียงลงในแอป Android

ข้อกำหนดเบื้องต้น

  • IMA Android SDK เวอร์ชัน 3.16.1 ขึ้นไป

เราขอแนะนำให้ผู้เผยแพร่เนื้อหาดู ตัวอย่างโปรแกรมเล่นเสียง บน GitHub เป็นจุดเริ่มต้นหากปัจจุบันยังไม่มีแอปโปรแกรมเล่นเสียง ตัวอย่างนี้ใช้ ExoPlayer เป็นโปรแกรมเล่นเบื้องหน้า ส่วนที่เหลือของคู่มือนี้จะอธิบายคุณลักษณะที่จำเป็นสำหรับการเล่นเสียงในพื้นหลังของโฆษณา IMA

การเพิ่มการเล่นโฆษณาขณะล็อกหน้าจอหรือขณะใช้แอปอื่นลงในแอป

คุณสร้างคอมโพเนนต์ Service ที่มีโปรแกรมเล่นเสียงที่กำหนดเองและตัวโหลดโฆษณาเพื่อให้การเล่นเพลงและโฆษณาเสียงเล่นต่อเมื่อแอปอยู่ในโหมดเบื้องหลังได้

หากแอปของคุณมี MainActivity และ AudioPlayerService สำหรับการเล่นเสียง คุณสามารถแก้ไขไฟล์ 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>

ในบริการนี้ คุณจะสร้างโปรแกรมเล่นเสียงที่กำหนดเองซึ่งเป็นโปรแกรมเล่นสื่อแบบใดก็ได้ ตราบใดที่โปรแกรมดังกล่าวใช้อินเทอร์เฟซ VideoAdPlayer สำหรับการโต้ตอบกับ IMA SDK ไว้ด้วย

IMA SDK เวอร์ชัน 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);
  }
  ...
}

การใช้โฆษณาที่มีช่องโฆษณาที่แสดงร่วม

คุณสามารถเริ่มต้นโฆษณาโดยมีหรือไม่มีช่องโฆษณาที่แสดงร่วม หากคุณเลือกที่จะแสดงโฆษณาที่แสดงร่วม คุณต้องให้สิทธิ์เข้าถึง AudioPlayerService แก่คลาส MainActivity ผ่านการเชื่อมโยงบริการตามที่แสดงไว้ด้านล่าง

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() และส่งคอนเทนเนอร์ UI เพื่อแสดงโฆษณาแบนเนอร์ที่แสดงร่วมกันเมื่อคุณเริ่มต้นโฆษณาจากคลาส 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);
  }
  ...
}

คุณสามารถเปรียบเทียบการใช้งานของคุณกับตัวอย่างโปรแกรมเล่นเสียงหากพบปัญหา หากมีคำถามเพิ่มเติมเกี่ยวกับการเล่นโฆษณาเสียงที่เล่นอยู่เบื้องหลัง โปรดติดต่อขอรับการสนับสนุนในฟอรัม IMA SDK