Phát quảng cáo dạng âm thanh trong nền

Hướng dẫn này dành cho các nhà xuất bản muốn tải quảng cáo dạng âm thanh vào ứng dụng Android của họ.

Điều kiện tiên quyết

  • IMA Android SDK phiên bản 3.16.1 trở lên.

Các nhà xuất bản nên xem Ví dụ về Trình phát âm thanh trên github để bắt đầu nếu họ hiện chưa có ứng dụng trình phát âm thanh. Ví dụ này sử dụng ExoPlayer làm trình phát trên nền trước. Phần còn lại của hướng dẫn này sẽ mô tả các tính năng cần thiết để phát âm thanh ở chế độ nền của quảng cáo IMA.

Thêm tính năng phát quảng cáo trong nền vào ứng dụng của bạn

Để tiếp tục phát quảng cáo dạng âm thanh và nhạc khi ứng dụng ở chế độ nền, bạn có thể tạo một thành phần Service chứa một trình phát âm thanh tuỳ chỉnh và một trình tải quảng cáo.

Nếu ứng dụng của bạn có MainActivityAudioPlayerService để phát âm thanh, bạn có thể sửa đổi tệp AndroidManifest.xml như minh hoạ dưới đây:

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

Trong dịch vụ, bạn có thể tạo một trình phát âm thanh tuỳ chỉnh mà bất kỳ trình phát nội dung đa phương tiện nào cũng có thể làm, miễn là trình phát này cũng triển khai giao diện VideoAdPlayer để tương tác với SDK IMA.

SDK IMA phiên bản 3.16.1 đã thêm một hàm mới, createAudioAdDisplayContainer, để tạo một vùng chứa chuyên biệt cho một trình tải quảng cáo nhằm yêu cầu quảng cáo dạng âm thanh.

Đoạn mã sau đây cho thấy một ví dụ về AudioPlayerService để khởi chạy và tạo yêu cầu quảng cáo dạng âm thanh.

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

Sử dụng quảng cáo có vùng quảng cáo đồng hành

Bạn có thể khởi chạy quảng cáo có hoặc không có vùng quảng cáo đồng hành. Nếu chọn hiển thị quảng cáo đồng hành, bạn cần cung cấp quyền truy cập AudioPlayerService vào lớp MainActivity thông qua một trình liên kết dịch vụ như thể hiện dưới đây:

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

Bạn có thể gọi hàm addCompanionAdSlot() và truyền vùng chứa giao diện người dùng để hiển thị quảng cáo biểu ngữ đi kèm khi khởi chạy quảng cáo từ lớp 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);
  }
  ...
}

Bạn có thể so sánh cách triển khai của mình với Ví dụ về Trình phát âm thanh nếu gặp vấn đề. Nếu bạn có câu hỏi khác về tính năng phát quảng cáo dạng âm thanh trong nền, vui lòng liên hệ trong diễn đàn IMA SDK để được hỗ trợ.