إتاحة الإعلانات الصوتية في الخلفية

هذا الدليل مخصّص للناشرين المهتمّين بعرض إعلانات صوتية في تطبيقاتهم على Android.

المتطلبات الأساسية

  • الإصدار 3.16.1 من حزمة تطوير البرامج (SDK) لإعلانات الوسائط التفاعلية على Android أو إصدار أحدث

ننصح الناشرين بالاطّلاع على الـ Audio Player Example على GitHub كنقطة بداية إذا لم يكن لديهم حاليًا تطبيق مشغّل صوت. يستخدم هذا المثال ExoPlayer كمشغّل في المقدّمة. سيتناول بقية هذا الدليل الميزات اللازمة لتشغيل الإعلانات الصوتية في الخلفية في "إعلانات الوسائط التفاعلية".

إضافة تشغيل الإعلانات في الخلفية إلى تطبيقك

لكي يستمر تشغيل الموسيقى والإعلانات الصوتية عندما يكون التطبيق في وضع التشغيل في الخلفية، يمكنك إنشاء 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 للتفاعل مع حزمة تطوير البرامج لإعلانات الوسائط التفاعلية.

أضاف الإصدار 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() وتمرير حاوية واجهة مستخدِم لعرض الإعلانات البانر المصاحبة أثناء تهيئة الإعلانات من فئة 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);
  }
  ...
}

يمكنك مقارنة عملية التنفيذ بمثال مشغّل الصوت إذا واجهتك مشكلة. لمزيد من الأسئلة حول تشغيل الإعلانات الصوتية في الخلفية، يُرجى التواصل من خلال مركز مساعدة "إدارة إعلانات Google" للحصول على الدعم.