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

Hướng dẫn này dành cho những nhà xuất bản quan tâm đến việc 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

  • SDK IMA cho Android 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 làm điểm xuất phát 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 ở chế độ nền vào ứng dụng

Để tiếp tục phát nhạc và quảng cáo dạng âm thanh khi ứng dụng ở chế độ nền, bạn có thể tạo một thành phần Service chứa trình phát âm thanh tuỳ chỉnh và 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ư sau:

<?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ụ này, bạn có thể tạo trình phát âm thanh tuỳ chỉnh, có thể là bất kỳ trình phát nội dung đa phương tiện nào, 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 trình tải quảng cáo yêu cầu quảng cáo âm thanh.

Đoạn mã sau đây cho thấy ví dụ về AudioPlayerService để khởi chạy và tạo yêu cầu quảng cáo â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ị trí 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ị trí 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 cấp quyền truy cập của AudioPlayerService vào lớp MainActivity thông qua trình liên kết dịch vụ như minh hoạ bên dưới:

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 một vùng chứa giao diện người dùng để hiển thị quảng cáo biểu ngữ đồng hành 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ó thêm câu hỏi về việc phát quảng cáo dạng âm thanh ở chế độ nền, vui lòng liên hệ trong diễn đàn SDK IMA để được hỗ trợ.