# AdMob

## 1. 기본 요건

* [ADX Android SDK](/adx/android/integrate.md#2-adx-android-sdk)를 프로젝트에 추가합니다.
* Rewarded Ad용으로 발급받은 애드몹 Ad Unit ID를 사용합니다.
* 광고를 요청하기 전에 [SDK 초기화](/adx/android/sdk-integration/initialize.md)를 먼저 진행합니다.
  * **SDK 초기화는 앱 실행 시 한 번만 호출**하여 주시고, **광고 요청은 초기화가 완료된 후**에 이뤄져야 합니다.
* `AndroidManifest.xml` 파일에 `<meta-data>` 태그에 `"com.google.android.gms.ads.APPLICATIONID"`와 발급된 애드몹 APP ID를 추가합니다.

```typescript
    <application>
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="YOUR_ADMOB_APP_ID"/>
    </application>
</manifest>
```

## 2. 구현

{% hint style="info" %}
Rewarded Ad load에 시간이 걸릴 수 있으니, 미리 load 해두신 다음 사용하시는 것을 권장드립니다.
{% endhint %}

1. `AdRequest`를 생성합니다.
   * GDPR 관련 규정을 준수하는 경우, 사용자가 개인정보 활용 및 수집을 거부한 상태(`ADXConsentStateDenied`)일 때 `npa`를 `1`로 추가합니다.
2. `RewardAd`의 `load()`로 광고를 로드합니다.
3. 광고 로드가 완료되면 `onAdLoaded` callback이 호출됩니다.
4. 표시 할 광고가 있는지 확인 후, `show()`로 광고를 표시합니다.
5. 광고 시청을 모두 완료하면 `onUserEarnedReward` callback을 받은 후 보상을 지급하도록 처리합니다.

{% tabs %}
{% tab title="Java" %}

```java
public class RewardedVideoAdMobActivity extends AppCompatActivity {
    private RewardedAd rewardedAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rewarded_video_admob);

        loadAd();
    }

    public void loadAd() {
        Bundle extras = new Bundle();

        if (ADXGDPR.ADXConsentState.values()[ADXGdprManager.getResultGDPR(this)] == ADXGDPR.ADXConsentState.ADXConsentStateDenied) {
            extras.putString("npa", "1");
        }
        AdRequest adRequest = new AdRequest.Builder()
                .addNetworkExtrasBundle(AdMobAdapter.class, extras)
                .build();

        RewardedAd.load(this, "<YOUR_ADMOB_AD_UNIT_ID>", adRequest, new RewardedAdLoadCallback() {
            @Override
            public void onAdLoaded(@NonNull RewardedAd rewardedAd) {
                // Ad successfully loaded.
                Log.d(TAG, "onAdLoaded");

                mRewardedAd = rewardedAd;

                mRewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() {
                    @Override
                    public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                        // Ad failed to display.
                        Log.d(TAG, "onRewardedAdFailedToShow : " + adError.getCode());
                    }

                    @Override
                    public void onAdShowedFullScreenContent() {
                        // Ad opened.
                        mRewardedAd = null;
                        Log.d(TAG, "onAdShowedFullScreenContent");
                    }

                    @Override
                    public void onAdDismissedFullScreenContent() {
                        // Ad closed.
                        Log.d(TAG, "onAdDismissedFullScreenContent");
                        loadAd();
                    }

                    @Override
                    public void onAdImpression() {
                        // Ad Impression
                        Log.d(TAG, "onAdImpression");
                    }
                });
            }

            @Override
            public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                // Ad failed to load.
                Log.d(TAG, "onRewardedAdFailedToLoad : " + loadAdError.getCode());
            }
        });
    }

    public void showAd() {

        if (mRewardedAd != null) {
            mRewardedAd.show(this, new OnUserEarnedRewardListener() {
                @Override
                public void onUserEarnedReward(@NonNull RewardItem rewardItem) {
                    // User earned reward.
                    Log.d(TAG, "onUserEarnedReward");
                }
            });
        } else {
            Log.d(TAG, "The rewarded ad wasn't loaded yet.");
            loadAd();
        }
    }

    @Override
    protected void onDestroy() {
        mRewardedAd = null;

        super.onDestroy();
    }
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
class RewardedVideoAdMobActivity : AppCompatActivity() {
    private var mRewardedAd: RewardedAd? = null
    private var mButton: Button? = null
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_rewarded_video_admob)
        
        loadAd()
    }

    fun loadAd() {
        val extras = Bundle()
        
        if (ADXGDPR.ADXConsentState.values()[ADXGdprManager.getResultGDPR(this)] == ADXGDPR.ADXConsentState.ADXConsentStateDenied) {
            extras.putString("npa", "1")
        }
        
        val adRequest = AdRequest.Builder()
            .addNetworkExtrasBundle(AdMobAdapter::class.java, extras)
            .build()
        
        RewardedAd.load(this, "<YOUR_ADMOB_AD_UNIT_ID>", adRequest, object : RewardedAdLoadCallback() {
            override fun onAdLoaded(rewardedAd: RewardedAd) {
                // Ad successfully loaded.
                Log.d(TAG, "onAdLoaded")
                
                mRewardedAd = rewardedAd
                mRewardedAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
                    override fun onAdFailedToShowFullScreenContent(adError: AdError) {
                        // Ad failed to display.
                        Log.d(TAG, "onRewardedAdFailedToShow : " + adError.code)
                    }

                    override fun onAdShowedFullScreenContent() {
                        // Ad opened.
                        mRewardedAd = null
                        Log.d(TAG, "onAdShowedFullScreenContent")
                    }

                    override fun onAdDismissedFullScreenContent() {
                        // Ad closed.
                        Log.d(TAG, "onAdDismissedFullScreenContent")
                        loadAd()
                    }

                    override fun onAdImpression() {
                        // Ad Impression
                        Log.d(TAG, "onAdImpression")
                    }
                }
            }

            override fun onAdFailedToLoad(loadAdError: LoadAdError) {
                // Ad failed to load.
                Log.d(TAG, "onRewardedAdFailedToLoad : " + loadAdError.code)
            }
        })
    }

    fun showAd() {
        if (mRewardedAd != null) {
            mRewardedAd!!.show(this) { // User earned reward.
                Log.d(TAG, "onUserEarnedReward")
            }
        } else {
            Log.d(TAG, "The rewarded ad wasn't loaded yet.")
            loadAd()
        }
    }

    override fun onDestroy() {
        mRewardedAd = null
        
        super.onDestroy()
    }
}
```

{% endtab %}
{% endtabs %}

## 3. Callback

`FullScreenContentCallback`을 설정하여 특정 이벤트를 수신할 수 있습니다.

{% hint style="info" %}
`RewardedAd`는 **일회용 객체**로 보상형 광고가 표시된 후에는 다시 표시되지 않습니다.

이전 광고가 닫힌 직후 다음 보상형 광고가 로드될 수 있도록 `onAdDidDismissFullScreenContent()` 에 다른 보상형 광고를 로드하는 것이 좋습니다.
{% endhint %}

{% tabs %}
{% tab title="Java" %}

```java
mRewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() {
    @Override
    public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
        // Ad failed to display.
        Log.d(TAG, "onRewardedAdFailedToShow : " + adError.getCode());
    }

    @Override
    public void onAdShowedFullScreenContent() {
        // Ad opened.
        mRewardedAd = null;
        Log.d(TAG, "onAdShowedFullScreenContent");
    }

    @Override
    public void onAdDismissedFullScreenContent() {
        // Ad closed.
        Log.d(TAG, "onAdDismissedFullScreenContent");
        loadAd();
    }

    @Override
    public void onAdImpression() {
        // Ad Impression
        Log.d(TAG, "onAdImpression");
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
mRewardedAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
    override fun onAdFailedToShowFullScreenContent(adError: AdError) {
        // Ad failed to display.
        Log.d(TAG, "onRewardedAdFailedToShow : " + adError.code)
    }

    override fun onAdShowedFullScreenContent() {
        // Ad opened.
        mRewardedAd = null
        Log.d(TAG, "onAdShowedFullScreenContent")
    }

    override fun onAdDismissedFullScreenContent() {
        // Ad closed.
        Log.d(TAG, "onAdDismissedFullScreenContent")
        loadAd()
    }

    override fun onAdImpression() {
        // Ad Impression
        Log.d(TAG, "onAdImpression")
    }
}
```

{% endtab %}
{% endtabs %}

## 4. 테스트 기기 등록

개발 중 상용 광고 키로 광고를 테스트하려는 경우 아래 단계에 따라 테스트 기기를 등록 후 사용해주시기 바랍니다.

{% hint style="danger" %}
테스트 기기 미등록 상태로 테스트할 경우 계정이 정지될 수 있습니다.
{% endhint %}

1\) ADXLibrary를 적용 후 광고를 로드하는 코드가 삽입된 상태로 실행해주시면 콘솔에서 해당 로그를 확인하실 수 있습니다.

```csharp
 I/Ads: Use RequestConfiguration.Builder.setTestDeviceIds(Arrays.asList("33BE2250B43518CCDA7DE426D04EE231"))
to get test ads on this device."
```

2\) 출력된 Device ID를 복사하여 아래와 같이 `setTestDeviceIds()` 를 호출하여 테스트 기기를 등록해주시면 됩니다.

{% hint style="info" %}
앱을 출시하기 전에 이러한 테스트 기기를 설정하는 코드를 반드시 삭제하세요.
{% endhint %}

{% tabs %}
{% tab title="Java" %}

```java
RequestConfiguration configuration = new RequestConfiguration.Builder()
                        .setTestDeviceIds(Arrays.asList("33BE2250B43518CCDA7DE426D04EE231")).build();
MobileAds.setRequestConfiguration(configuration);
```

{% endtab %}

{% tab title="Kotlin" %}

```java
val configuration = RequestConfiguration.Builder()
            .setTestDeviceIds(Arrays.asList("33BE2250B43518CCDA7DE426D04EE231")).build()
MobileAds.setRequestConfiguration(configuration)
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://platform-business.gitbook.io/adx/android/sdk-integration/ad-formats/rewarded-ad-hidden/admob.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
