보상형 광고 어댑터 구현

미디에이션 어댑터는 Google 모바일 광고 SDK에서 메시지 및 요청을 수신하고 서드 파티 네트워크 SDK와 통신하여 이러한 요청을 처리합니다.

이 가이드는 Google 모바일 광고 미디에이션용 보상형 광고 미디에이션 어댑터를 만들려는 광고 네트워크를 대상으로 합니다. 예시를 위해 아래의 코드 스니펫에 샘플 SDK가 사용되었습니다. 이 샘플 SDK용으로 빌드된 어댑터의 전체 구현은 Android미디에이션 프로젝트에서 확인할 수 있습니다. 이 가이드에서는 어댑터를 제작하는 방법을 설명합니다.

어댑터 클래스 이름 및 서버 매개변수 정의

AdMob 미디에이션 플랫폼을 통해 미디에이션되는 광고 네트워크는 일반적으로 게시자를 식별하기 위해 하나 이상의 식별자가 필요합니다. 이러한 식별자는 서버 매개변수로 표현되며, AdMob UI에서 미디에이션을 위해 서드 파티 광고 네트워크를 구성할 때 정의됩니다.

미디에이션 어댑터를 개발하기 전에 Google에 어댑터 클래스 이름 및 기타 필수 매개변수를 제공하여 광고 네트워크에 대한 액세스 권한을 얻어야 합니다.

어댑터 클래스 구현

첫 번째 단계는 Adapter 추상 클래스를 구현하는 것입니다.

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

public class SampleAdapter extends Adapter {
 ...
}

이렇게 변경하면 클래스에서 아래에 설명된 여러 메서드를 구현할 수 있습니다.

버전 번호 보고

어댑터는 어댑터의 버전과 서드 파티 SDK 버전을 모두 Google 모바일 광고 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 UI 내의 앱용으로 구성된 모든 어댑터에서 initialize()가 호출됩니다.

List<MediationConfiguration> 인수는 AdMob UI에서 광고 네트워크를 위해 구성된 모든 게재위치에 대한 정보를 제공합니다. 광고 네트워크 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에 광고가 게재되지 않았음을 알립니다.