实现激励广告适配器

中介适配器接收来自 Google 移动广告 SDK 的消息和请求,并与第三方广告联盟 SDK 通信以完成这些请求。

本指南适用于希望为 Google 移动广告中介构建激励广告中介适配器的广告联盟。下面的代码段中使用了示例 SDK 进行演示。您可以在我们的 Android中介项目中找到为此示例 SDK 构建的适配器的完整实现。本指南介绍了如何构建适配器。

定义适配器类名称和服务器参数

对于通过 AdMob 中介平台进行中介的广告联盟,通常需要使用一个或多个标识符来识别发布商。这些标识符以服务器参数的形式表示。当您在 AdMob 界面中配置用于中介的第三方广告联盟时,可以定义这些标识符。

在开发中介适配器之前,您必须向 Google 提供您的适配器类名称和其他必需参数,以获得广告网络的访问权限。

实现 Adapter 类

第一步是实现 Adapter 抽象类:

...
import com.google.android.gms.ads.mediation.Adapter;
...

public class SampleAdapter extends Adapter {
 ...
}

此变更可确保您的类实现下面讨论的多种方法。

报告版本号

适配器必须向 Google 移动广告 SDK 报告适配器本身和第三方 SDK 的版本。使用 VersionInfo报告版本。

Google 标明版本的开源适配器使用 4 位数的适配器版本模式,但 VersionInfo只允许有 3 位数。如需解决此问题,建议将最后两位数字组合为补丁版本,如下所示:

...
import com.google.android.gms.ads.VersionInfo;
...

public class SampleAdapter extends Adapter implements SampleRewardedAdListener {
  ...
  @Override
  public VersionInfo getVersionInfo() {
    String versionString = BuildConfig.VERSION_NAME;
    String[] splits = versionString.split("\\.");

    if (splits.length >= 4) {
      int major = Integer.parseInt(splits[0]);
      int minor = Integer.parseInt(splits[1]);
      int micro = Integer.parseInt(splits[2]) * 100 + Integer.parseInt(splits[3]);
      return new VersionInfo(major, minor, micro);
    }

    return new VersionInfo(0, 0, 0);
  }

  @Override
  public VersionInfo getSDKVersionInfo() {
    String versionString = SampleAdRequest.getSDKVersion();
    String[] splits = versionString.split("\\.");

    if (splits.length >= 3) {
      int major = Integer.parseInt(splits[0]);
      int minor = Integer.parseInt(splits[1]);
      int micro = Integer.parseInt(splits[2]);
      return new VersionInfo(major, minor, micro);
    }

    return new VersionInfo(0, 0, 0);
  }
  ...
}

初始化适配器

在应用初始化 Google 移动广告 SDK 后,系统会对在 AdMob 界面中为该应用配置的所有适配器调用 initialize()

List<MediationConfiguration> 参数会提供在 AdMob 界面中为广告联盟配置的所有展示位置的相关信息。使用此信息来初始化广告联盟 SDK。初始化广告联盟 SDK 后,您可以通过对 initialize() 调用中提供的 InitializationCompleteCallback 参数调用 onInitializationSucceeded()onInitializationFailed() 方法,向 Google 移动广告 SDK 报告初始化是成功还是失败。

...
import com.google.android.gms.ads.mediation.InitializationCompleteCallback;
import com.google.android.gms.ads.mediation.MediationConfiguration;
...

public class SampleAdapter extends Adapter {
  ...
  @Override
  public void initialize(
      Context context,
      InitializationCompleteCallback initializationCompleteCallback,
      List<MediationConfiguration> mediationConfigurations) {
    if (context == null) {
      initializationCompleteCallback.onInitializationFailed(
          "Initialization Failed: Context is null.");
      return;
    }

    // The Sample SDK doesn't have an initialization method, so this example
    // immediately reports a success callback.
    initializationCompleteCallback.onInitializationSucceeded();
  }
  ...
}

请求激励广告

使用 loadRewardedAd() 方法请求激励广告。保留对 MediationAdLoadCallback 的引用,以便向 Google 移动广告 SDK 报告广告加载是成功还是失败。

在调用 onSuccess() 后,MediationRewardedAdCallback 对象将可用,稍后您将使用该对象中继其他广告事件,例如点击或授予的奖励。

...
import com.google.ads.mediation.sample.sdk.SampleAdRequest;
import com.google.ads.mediation.sample.sdk.SampleRewardedAd;
import com.google.ads.mediation.sample.sdk.SampleRewardedAdListener;
import com.google.android.gms.ads.mediation.MediationAdLoadCallback;
import com.google.android.gms.ads.mediation.MediationRewardedAd;
import com.google.android.gms.ads.mediation.MediationRewardedAdCallback;
...

public class SampleAdapter extends Adapter, SampleRewardedAdListener
    implements MediationRewardedAd {
  ...

  /**
   * A MediationAdLoadCallback that handles any callback when a Sample rewarded
   * ad finishes loading.
   */
  private MediationAdLoadCallback<MediationRewardedAd, MediationRewardedAdCallback> adLoadCallBack;

  /**
   * Represents a SampleRewardedAd.
   */
  private SampleRewardedAd sampleRewardedAd;

  /**
   * Used to forward rewarded video ad events to the Google Mobile Ads SDK..
   */
  private MediationRewardedAdCallback rewardedAdCallback;

  ...

  // Hold a reference to the MediationAdLoadCallback object to report ad load
  // events to the Google Mobile Ads SDK.
  @Override
  public void loadRewardedAd(
      MediationRewardedAdConfiguration mediationRewardedAdConfiguration,
      MediationAdLoadCallback<MediationRewardedAd, MediationRewardedAdCallback>
          mediationAdLoadCallback) {
    adLoadCallBack = mediationAdLoadCallback;
    MediationRewardedAdConfiguration adConfiguration = mediationRewardedAdConfiguration;

    String adUnitId = adConfiguration.getServerParameters().getString(SAMPLE_AD_UNIT_KEY);

    sampleRewardedAd = new SampleRewardedAd(adUnitId);
    SampleAdRequest request = new SampleAdRequest();
    sampleRewardedAd.setListener(this);
    sampleRewardedAd.loadAd(request);
  }

  // Hold a reference to the MediationRewardedAdCallback object to report ad
  // lifecycle events to the Google Mobile Ads SDK.
  @Override
  public void onRewardedAdLoaded() {
    rewardedAdCallback = mediationAdLoadCallBack.onSuccess(this);
  }

  @Override
  public void onRewardedAdFailedToLoad(SampleErrorCode error) {
    mediationAdLoadCallBack.onFailure(error.toString());
  }
  ...
}

展示广告

当系统通知 SDK 成功加载广告后,Google 移动广告 SDK 可能会随时调用适配器的 showAd() 方法。适配器应展示激励广告。如果由于任何原因无法展示广告,请调用 onAdFailedToShow() 回调。

public class SampleAdapter extends Adapter, SampleRewardedAdListener
    implements MediationRewardedAd {
  ...
  @Override
  public void showAd(Context context) {
    if (!(context instanceof Activity)) {
      rewardedAdCallback.onAdFailedToShow(
          "An activity context is required to show Sample rewarded ad.");
      return;
    }
    Activity activity = (Activity) context;

    if (!sampleRewardedAd.isAdAvailable()) {
      rewardedAdCallback.onAdFailedToShow("No ads to show.");
      return;
    }
    sampleRewardedAd.showAd(activity);
  }
  ...
}

向移动广告 SDK 报告广告事件

展示广告后,适配器应使用广告成功加载时提供的 MediationRewardedAdCallback 对象,根据需要向 Google 移动广告 SDK 报告广告生命周期事件。

通常,这些回调是从广告联盟 SDK 触发的回调方法转发的。以下示例实现了示例 SDK 回调,并将其映射到 MediationRewardedAdCallback 上提供的回调。

public class SampleAdapter extends Adapter, SampleRewardedAdListener
    implements MediationRewardedAd {
  ...
  @Override
  public void onAdRewarded(final String rewardType, final int amount) {
    RewardItem rewardItem =
        new RewardItem() {
          @Override
          public String getType() {
            return rewardType;
          }

          @Override
          public int getAmount() {
            return amount;
          }
        };
    rewardedAdCallback.onUserEarnedReward(rewardItem);
  }

  @Override
  public void onAdClicked() {
    rewardedAdCallback.reportAdClicked();
  }

  @Override
  public void onAdFullScreen() {
    rewardedAdCallback.onAdOpened();
    rewardedAdCallback.onVideoStart();
    rewardedAdCallback.reportAdImpression();
  }

  @Override
  public void onAdClosed() {
    rewardedAdCallback.onAdClosed();
  }

  @Override
  public void onAdCompleted() {
    rewardedAdCallback.onVideoComplete();
  }
  ...
}

下面详细说明了应向 Google 移动广告 SDK 报告的广告事件:

广告事件 说明
onAdOpened() 向 Google 移动广告 SDK 发出广告将打开的通知。
onVideoStart() 向 Google 移动广告 SDK 发出激励广告开始播放的通知。
reportAdImpression() 向 Google 移动广告 SDK 发出广告展示了一次的通知。
onVideoComplete() 向 Google 移动广告 SDK 发出激励广告已播放完毕的通知。
onUserEarnedReward() 向 Google 移动广告 SDK 发出用户已获得奖励的通知。
reportAdClicked() 向 Google 移动广告 SDK 发出用户已点击广告的通知。
onAdClosed() 向 Google 移动广告 SDK 发出广告已关闭的通知。
onAdFailedToShow() 向 Google 移动广告 SDK 发出广告未能展示的通知。