보상형 광고

보상형 광고는 상호작용하는 사용자에게 인앱 보상을 제공하는 광고입니다. 이 가이드에는 AdMob의 보상형 광고를 Android 앱에 통합하는 방법이 나와 있습니다. 고객 성공사례인 우수사례 1우수사례 2를 읽어보세요.

보상 광고가 어떻게 작동하는지 알아보려면 아래의 데모를 보세요. 이 데모에서는 간단한 게임에 통합된 보상형 동영상 광고의 흐름을 보여줍니다.

기본 요건

  • Google 모바일 광고 SDK 17.2.0 이상
  • 시작하기 가이드에 따라 Google 모바일 광고 SDK를 가져오고 Android 매니페스트를 업데이트하세요.

보상형 광고 객체 만들기

보상형 광고는 RewardedAd 객체에 의해 요청 및 표시됩니다. 첫 번째 단계는 RewardedAd를 인스턴스화하는 것입니다. 이 작업은 다음 코드 스니펫에 있는 ActivityonCreate() 메서드에서 처리됩니다.

자바

import com.google.android.gms.ads.rewarded.RewardedAd;

public class MainActivity extends Activity {

    private RewardedAd rewardedAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        rewardedAd = new RewardedAd(this,
            "ca-app-pub-3940256099942544/5224354917");
    }

}

Kotlin

import com.google.android.gms.ads.rewarded.RewardedAd

class MainActivity : Activity() {

  private lateinit var rewardedAd: RewardedAd

  override fun onCreate(savedInstanceState:Bundle) {
    ...
    rewardedAd = RewardedAd(this,
        "ca-app-pub-3940256099942544/5224354917")
  }
}

생성자에는 다음과 같은 인수가 필요합니다.

  • Activity 컨텍스트
  • 보상형 광고를 로드하는 데 사용할 광고 단위 ID

항상 테스트 광고로 테스트하기

앱을 제작하고 테스트할 때 운영 중인 실제 광고 대신 테스트 광고를 사용하세요. 이렇게 하지 않으면 계정이 정지될 수 있습니다.

테스트 광고를 로드하는 가장 쉬운 방법은 Android 보상형 광고의 테스트 전용 광고 단위 ID를 사용하는 것입니다.

ca-app-pub-3940256099942544/5224354917

이 ID는 모든 요청에 대해 테스트 광고를 반환하도록 특별히 구성되었으며, 코딩, 테스트 및 디버깅 중에 앱에서 자유롭게 사용할 수 있습니다. 앱을 게시하기 전에 이 ID를 자체 광고 단위 ID로 바꿔야 합니다.

모바일 광고 SDK의 테스트 광고가 작동하는 방식을 자세히 알아보려면 테스트 광고를 참고하세요.

광고 로드하기

보상형 광고를 로드하려면 RewardedAd 객체의 loadAd() 메서드를 호출하세요. 이 메서드에는 AdRequestRewardedAdLoadCallback 인스턴스가 인수로 필요합니다.

자바

import com.google.android.gms.ads.rewarded.RewardedAd;

public class MainActivity extends Activity {

    private RewardedAd rewardedAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        rewardedAd = new RewardedAd(this,
            "ca-app-pub-3940256099942544/5224354917");

        RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() {
            @Override
            public void onRewardedAdLoaded() {
                // Ad successfully loaded.
            }

           @Override
            public void onRewardedAdFailedToLoad(int errorCode) {
                // Ad failed to load.
            }
        };
        rewardedAd.loadAd(new AdRequest.Builder().build(), adLoadCallback);
    }
}

Kotlin

import com.google.android.gms.ads.rewarded.RewardedAd

class MainActivity : Activity() {

  private val rewardedAd: RewardedAd

  override fun onCreate(savedInstanceState:Bundle) {
    rewardedAd = RewardedAd(this, "ca-app-pub-3940256099942544/5224354917")
    val adLoadCallback = object: RewardedAdLoadCallback() {
      fun onRewardedAdLoaded() {
        // Ad successfully loaded.
      }
      fun onRewardedAdFailedToLoad(errorCode: Int) {
        // Ad failed to load.
      }
    }
    rewardedAd.loadAd(AdRequest.Builder().build(), adLoadCallback)
  }
}

RewardedAdLoadCallbackonRewardedAdLoaded()onRewardedAdFailedToLoad() 메서드에서 광고 로드 작업 결과를 제공합니다.

재정의가 가능한 메서드
onRewardedAdLoaded() 이 메서드는 광고 로드가 완료되면 실행됩니다.
onRewardedAdFailedToLoad() 이 메서드는 광고 로드에 실패할 때 호출됩니다. 이 메서드에는 발생한 오류 유형을 나타내는 errorCode 매개변수가 포함됩니다. 가능한 값이 AdRequest 클래스의 상수로 정의됩니다(아래 참고).
  • ERROR_CODE_INTERNAL_ERROR: 광고 서버에서 잘못된 응답을 받는 등 내부적으로 오류가 발생했다는 의미입니다.
  • ERROR_CODE_INVALID_REQUEST: 광고 단위 ID가 잘못된 경우처럼 광고 요청이 잘못되었다는 의미입니다.
  • ERROR_CODE_NETWORK_ERROR: 네트워크 연결로 인해 광고 요청에 성공하지 못했다는 의미입니다.
  • ERROR_CODE_NO_FILL: 광고 요청에는 성공했지만 광고 인벤토리의 부족으로 광고가 반환되지 않았다는 의미입니다.

광고 게재하기

보상형 광고를 게재하기 전에 사용자에게 보상을 받는 대가로 보상형 광고 콘텐츠를 볼 것인지 여부를 선택할 수 있는 옵션을 명확히 제공해야 합니다. 보상형 광고에는 항상 선택 옵션을 제공해야 합니다.

RewardedAd를 표시하려면 isLoaded() 메서드를 사용하여 로드가 완료되었는지 확인한 다음 show()를 호출하세요. show() 메서드에는 ActivityRewardedAdCallback 인스턴스가 인수로 필요합니다. Activity 인스턴스는 보상형 광고가 표시되는 활동이어야 합니다.

이전 예시 코드의 보상형 광고가 다음과 같이 버튼의 OnClickListener에 표시될 수 있습니다.

자바

myButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (rewardedAd.isLoaded()) {
            Activity activityContext = MainActivity.this
            RewardedAdCallback adCallback = new RewardedAdCallback() {
                @Override
                public void onRewardedAdOpened() {
                    // Ad opened.
                }

                @Override
                public void onRewardedAdClosed() {
                    // Ad closed.
                }

                @Override
                public void onUserEarnedReward(@NonNull RewardItem reward) {
                    // User earned reward.
                }

                @Override
                public void onRewardedAdFailedToShow(int errorCode) {
                    // Ad failed to display.
                }
            };
            rewardedAd.show(activityContext, adCallback);
        } else {
            Log.d("TAG", "The rewarded ad wasn't loaded yet.");
        }
    }
});

Kotlin

myButton.setOnClickListener {
  if (rewardedAd.isLoaded) {
    val activityContext: Activity = this@MainActivity
    val adCallback = object: RewardedAdCallback() {
      override fun onRewardedAdOpened() {
        // Ad opened.
      }
      override fun onRewardedAdClosed() {
        // Ad closed.
      }
      override fun onUserEarnedReward(@NonNull reward: RewardItem) {
        // User earned reward.
      }
      override fun onRewardedAdFailedToShow(errorCode: Int) {
        // Ad failed to display.
      }
    }
    rewardedAd.show(activityContext, adCallback)
  }
  else {
    Log.d("TAG", "The rewarded ad wasn't loaded yet.")
  }
}

광고 이벤트 알림 받기

show() 메서드에 제공된 RewardedAdCallback에서 보상형 광고 이벤트에 대한 알림을 받습니다. RewardedAdCallback에서 재정의할 수 있는 각 메서드는 보상형 광고 주기에서 발생하는 이벤트 하나에 해당합니다. 예를 들어 onUserEarnedReward() 메서드로 사용자에게 보상을 제공하면 좋습니다. 각 광고 이벤트 메서드에 대한 자세한 내용은 아래와 같습니다.

재정의가 가능한 메서드
onRewardedAdOpened() 이 메서드는 광고가 표시될 때 호출되며 기기 화면을 덮습니다.
onRewardedAdClosed() 이 메서드는 사용자가 닫기 아이콘을 탭하거나 뒤로 버튼을 사용하여 보상형 광고를 닫을 때 호출됩니다. 앱에서 오디오 출력 또는 게임 루프를 일시중지했을 때 이 메서드로 재개하면 편리합니다.
onUserEarnedReward() 이 메서드는 사용자가 광고와 상호작용하여 보상을 받아야 할 때 호출됩니다. 광고 단위에 설정된 보상 관련 세부정보는 RewardItem 매개변수의 getType()getAmount() 메서드를 통해 액세스할 수 있습니다.
onRewardedAdFailedToShow() 이 메서드는 광고 표시에 실패할 때 호출됩니다. 이 메서드에는 발생한 오류 유형을 나타내는 errorCode 매개변수가 포함됩니다. 가능한 값이 RewardedAdCallback 클래스의 상수로 정의됩니다(아래 참고).
  • ERROR_CODE_INTERNAL_ERROR: 내부적으로 오류가 발생했다는 의미입니다.
  • ERROR_CODE_AD_REUSED: 보상형 광고가 이미 게재되었습니다. RewardedAd 객체는 일회용 객체로 한 번만 게재될 수 있습니다. 새 광고를 표시하려면 새 RewardedAd를 인스턴스화하여 로드하세요.
  • ERROR_CODE_NOT_READY: 광고가 성공적으로 로드되지 않았습니다.
  • ERROR_CODE_APP_NOT_FOREGROUND: 앱이 포그라운드에 있지 않은 경우 광고를 게재할 수 없습니다.

RewardedAdCallback을 사용하여 다음 보상형 광고 미리 로드하기

RewardedAd는 일회용 객체입니다. 즉 보상형 광고가 표시된 후에는 이 객체를 사용해 다른 광고를 로드할 수 없습니다. 다른 보상형 광고를 요청하려면 새 RewardedAd 객체를 만들어야 합니다.

이전 광고가 닫히자마자 다음 보상형 광고가 로드될 수 있도록 RewardedAdCallbackonRewardedAdClosed() 메서드에서 다른 보상형 광고를 로드하는 것이 좋습니다.

자바

public RewardedAd createAndLoadRewardedAd() {
        RewardedAd rewardedAd = new RewardedAd(this,
                "ca-app-pub-3940256099942544/5224354917");
        RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() {
            @Override
            public void onRewardedAdLoaded() {
                // Ad successfully loaded.
            }

            @Override
            public void onRewardedAdFailedToLoad(int errorCode) {
                // Ad failed to load.
            }
        };
        rewardedAd.loadAd(new AdRequest.Builder().build(), adLoadCallback);
        return rewardedAd;
}

@Override
public void onRewardedAdClosed() {
    this.rewardedAd = createAndLoadRewardedAd();
}

Kotlin

fun createAndLoadRewardedAd(): RewardedAd {
  val rewardedAd = RewardedAd(this, "ca-app-pub-3940256099942544/5224354917")
  val adLoadCallback = object: RewardedAdLoadCallback() {
    override fun onRewardedAdLoaded() {
      // Ad successfully loaded.
    }
    override fun onRewardedAdFailedToLoad(errorCode: Int) {
      // Ad failed to load.
    }
  }
  rewardedAd.loadAd(AdRequest.Builder().build(), adLoadCallback)
  return rewardedAd
}
fun onRewardedAdClosed() {
  this.rewardedAd = createAndLoadRewardedAd()
}

여러 보상형 광고 로드하기

여러 보상형 광고를 로드하려면 보상형 광고 객체 만들기 광고 로드하기 섹션에서 로드하려는 광고별 단계를 따르세요. 아래의 코드 스니펫에는 두 광고 게재위치에 2개의 보상형 광고를 로드하는 방법이 나와 있습니다.

자바

package ...

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.rewarded.RewardedAd;

public class MainActivity extends Activity {

    private RewardedAd gameOverRewardedAd;
    private RewardedAd extraCoinsRewardedAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        gameOverRewardedAd = createAndLoadRewardedAd(
          "ca-app-pub-3940256099942544/5224354917");
        extraCoinsRewardedAd = createAndLoadRewardedAd(
          "ca-app-pub-3940256099942544/5224354917");
    }

    public RewardedAd createAndLoadRewardedAd(String adUnitId) {
        RewardedAd rewardedAd = new RewardedAd(this, adUnitId);
        RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() {
            @Override
            public void onRewardedAdLoaded() {
                // Ad successfully loaded.
            }

            @Override
            public void onRewardedAdFailedToLoad(int errorCode) {
                // Ad failed to load.
            }
        };
        rewardedAd.loadAd(new AdRequest.Builder().build(), adLoadCallback);
        return rewardedAd;
    }
}

Kotlin

import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.rewarded.RewardedAd

class MainActivity: Activity() {

  private val gameOverRewardedAd:RewardedAd
  private val extraCoinsRewardedAd:RewardedAd

  override fun onCreate(savedInstanceState:Bundle) {
    ...
    gameOverRewardedAd = createAndLoadRewardedAd(
      "ca-app-pub-3940256099942544/5224354917")
    extraCoinsRewardedAd = createAndLoadRewardedAd(
      "ca-app-pub-3940256099942544/5224354917")
  }

  fun createAndLoadRewardedAd(adUnitId:String): RewardedAd {
    val rewardedAd = RewardedAd(this, adUnitId)
    val adLoadCallback = object: RewardedAdLoadCallback() {
      overrride fun onRewardedAdLoaded() {
        // Ad successfully loaded.
      }
      overrride fun onRewardedAdFailedToLoad(errorCode: Int) {
        // Ad failed to load.
      }
    }
    rewardedAd.loadAd(AdRequest.Builder().build(), adLoadCallback)
    return rewardedAd
  }
}

FAQ

RewardedAd에 대한 보상 세부정보를 확인할 수 있나요?
예. 가능합니다. onUserEarnedReward() 콜백이 실행되기 전에 보상 금액을 알아야 하는 경우 RewardedAdgetRewardItem() 메서드에서 광고가 로드된 후의 보상 금액을 확인할 수 있습니다.
초기화 호출에 제한 시간이 있나요?
10초가 지나면 미디에이션 네트워크에서 아직 초기화를 완료하지 않은 경우에도 Google 모바일 광고 SDK에서 OnInitializationCompleteListener를 호출합니다.
초기화 콜백을 받았을 때 일부 미디에이션 네트워크가 준비되지 않은 경우 어떻게 해야 하나요?

OnInitializationCompleteListener의 콜백 내에서 광고를 로드하는 것이 좋습니다. 미디에이션 네트워크가 준비되지 않은 경우에도 Google 모바일 광고 SDK에서 해당 네트워크에 광고를 요청합니다. 따라서 미디에이션 네트워크에서 시간이 초과된 후에 초기화를 완료하면 해당 세션에서 향후 광고 요청을 처리할 수 있습니다.

MobileAds.getInitializationStatus()를 호출하여 앱 세션 전체에서 모든 어댑터의 초기화 상태를 알아볼 수 있습니다.

특정 미디에이션 네트워크가 준비되지 않은 이유를 확인하려면 어떻게 해야 하나요?

AdapterStatus.getDescription()을 통해 어댑터에서 광고 요청을 처리할 준비가 되지 않은 이유를 알아볼 수 있습니다.

다음 단계

  • AdMob UI에서 자체 보상형 동영상 광고 단위를 만드세요.

  • 다음과 같은 다른 광고 형식을 사용해 보세요.