> ## Documentation Index
> Fetch the complete documentation index at: https://guide.daro.so/llms.txt
> Use this file to discover all available pages before exploring further.

# 리워드 비디오 광고

> DARO를 통해 리워드 비디오 광고를 구현하는 방법을 알아봅니다.

## 리워드 비디오 형태 소개

* 광고 시청을 대가로 인앱 가치를 지닌 보상(재화, 기능, 컨텐츠 등)을 제공하는 형태의 광고입니다.
* 보상을 대가로 시청하므로 동영상 광고의 스킵이 불가능하며 일반적인 길이는 30초입니다.

<img src="https://mintcdn.com/delightroom-5a71a6a8/dxU0bpsPoPvkYh_g/sdk-integration/common-img/ad-formats/rv-example-image.png?fit=max&auto=format&n=dxU0bpsPoPvkYh_g&q=85&s=42c4b8429cf25ce598c679e6eee00f70" alt="Rv Example Image Pn" title="Rv Example Image Pn" style={{ width:"38%" }} width="1080" height="2336" data-path="sdk-integration/common-img/ad-formats/rv-example-image.png" />

### How It Works

<img src="https://mintcdn.com/delightroom-5a71a6a8/dxU0bpsPoPvkYh_g/sdk-integration/common-img/ad-formats/rv-example-gif.gif?s=e6a8679d28bbe4600a449121ba4bbe53" alt="Rv Example Gif Gi" title="Rv Example Gif Gi" style={{ width:"38%" }} width="180" height="389" data-path="sdk-integration/common-img/ad-formats/rv-example-gif.gif" />

***

## 광고 연동하기

<Steps>
  <Step title="adUnit 생성">
    ```kotlin theme={null}
    val adUnit = DaroRewardedAdUnit(
        key = ${AdUnitId},
        placement = ${placement}, //로그 상 보여질 이름입니다. 공백을 보내도 무관합니다.
    )
    ```
  </Step>

  <Step title="Loader 생성 및 광고 로드">
    ```kotlin theme={null}
    val loader = DaroRewardedAdLoader(
        context = context,
        adUnit = adUnit
    )
    loader.setListener(object : DaroRewardedAdLoaderListener {
        override fun onAdLoadSuccess(ad: DaroRewardedAd, adInfo: DaroAdInfo) {
            // ...
        }
        override fun onAdLoadFail(err: DaroAdLoadError) {
            // ...
        }
    })
    loader.load()
    ```
  </Step>

  <Step title="리스너 설정 및 광고 표시">
    ```kotlin theme={null}
    loader.setListener(object : DaroRewardedAdLoaderListener {
        override fun onAdLoadSuccess(ad: DaroRewardedAd, adInfo: DaroAdInfo) {
            ad.setListener(object : DaroRewardedAdListener {
                override fun onShown(adInfo: DaroAdInfo) {}
                override fun onFailedToShow(adInfo: DaroAdInfo, error: DaroAdDisplayFailError) {}
                override fun onDismiss(adInfo: DaroAdInfo) {}
                override fun onEarnedReward(adInfo: DaroAdInfo, rewardItem: DaroRewardedAd.DaroRewardedItem) {}
            })
            ad.show(activity = this@MainActivity)
        }
        override fun onAdLoadFail(err: DaroAdLoadError) {}
    })
    ```
  </Step>

  <Step title="광고 시청 완료 후 destroy 호출">
    ```kotlin theme={null}
    ad.destroy()
    ```
  </Step>
</Steps>

<Info>
  아래와 같은 방법으로 서버 콜백 메서드를 설정할 수 있습니다.

  ```kotlin {4,5} theme={null}
    loader.setListener(object : DaroRewardedAdLoaderListener {
        override fun onAdLoadSuccess(ad: DaroRewardedAd, adInfo: DaroAdInfo) {
            ...
            Daro.setUserId(context = context, ${user_id})
            ad.setCustomData(${custom_data})
            ...
        }
        ...
    })
  ```
</Info>

***

## Example

```kotlin expandable theme={null}
private fun showRewardAd() {
    DaroRewardedAdLoader(
      context = context,
      adUnit = DaroRewardedAdUnit(
        key = ${AdUnitId},
        placement = ${placement}
      )
    ).apply {
      setListener(
        object : DaroRewardedAdLoaderListener {
          override fun onAdLoadSuccess(ad: DaroRewardedAd, adInfo: DaroAdInfo) {
            Log.d("Ad Test", "rewarded - success")

            ad.setListener(
              object : DaroRewardedAdListener {
                override fun onShown(adInfo: DaroAdInfo) {
                  Log.d("Ad Test", "rewarded - onShown")
                }

                override fun onFailedToShow(
                  adInfo: DaroAdInfo,
                  error: DaroAdDisplayFailError,
                ) {
                  Log.d("Ad Test", "rewarded - onFailedToShow")
                }

                override fun onDismiss(adInfo: DaroAdInfo) {
                  Log.d("Ad Test", "rewarded - onDismiss")
                  ad.destroy()
                }

                override fun onEarnedReward(
                  adInfo: DaroAdInfo,
                  rewardItem: DaroRewardedAd.DaroRewardedItem,
                ) {
                  Log.d("Ad Test", "rewarded - onEarnedReward")
                }
              },
            )

            Daro.setUserId(context = context, ${user_id})
            ad.setCustomData(${custom_data})

            ad.show(activity = this@MainActivity)
          }
        })
      load()
    }
  }
```

***

## 트러블슈팅: 광고 닫기 버튼 겹침 이슈

<Warning>
  DARO Android SDK를 사용해 보상형 광고를 표시할 때, 일부 광고 크리에이티브에서 Status Bar 또는 디스플레이 컷아웃(노치, 펀치홀) 영역과 UI가 겹쳐 보이는 현상이 발생할 수 있습니다.
  아래는 광고가 표시되는 동안만 Status Bar를 숨기고, 광고 종료 시 원복하는 방법을 안내합니다.
</Warning>

```kotlin theme={null}
// 광고 표시 전 - Status Bar 숨기기
private fun hideStatusBar(activity: Activity) {
    WindowCompat.setDecorFitsSystemWindows(activity.window, false)
    WindowInsetsControllerCompat(activity.window, activity.window.decorView).apply {
        hide(WindowInsetsCompat.Type.statusBars())
        systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    }
}

// 광고 종료 후 - Status Bar 복구
private fun showStatusBar(activity: Activity) {
    WindowCompat.setDecorFitsSystemWindows(activity.window, true)
    WindowInsetsControllerCompat(activity.window, activity.window.decorView).apply {
        show(WindowInsetsCompat.Type.statusBars())
    }
}
```

광고 리스너에서 다음과 같이 적용합니다:

```kotlin theme={null}
ad.setListener(object : DaroRewardedAdListener {
    override fun onShown(adInfo: DaroAdInfo) {
        hideStatusBar(activity)  // 방어적 재호출
    }
    override fun onFailedToShow(adInfo: DaroAdInfo, error: DaroAdDisplayFailError) {
        showStatusBar(activity)  // 실패 시 복구
    }
    override fun onDismiss(adInfo: DaroAdInfo) {
        showStatusBar(activity)  // 닫힘 시 복구
        ad.destroy()
    }
    override fun onEarnedReward(adInfo: DaroAdInfo, rewardItem: DaroRewardedAd.DaroRewardedItem) {}
})

hideStatusBar(activity)  // show() 직전에 호출
ad.show(activity = this@MainActivity)
```
