Google Admob으로 보상형 광고 표시하기

이번 포스팅에서는 보상형 광고를 표시하는 법에 대해 알아보도록 하겠습니다. 보상형 광고란 광고를 본 댓가로 어떤 아이템이나 보상을 주는 형태의 광고를 말합니다.

우선은 애드몹 디펜던시를 추가합니다. 현재 애드몹 라이브러리의 최신버전은 19.7.0인데요, 19.6.0과 사용법이 많이 다르기 때문에 두 방법 모두 설명하도록 하겠습니다.

Google Admob Version 19.6.0 이하에서의 구현

1
2
3
dependencies {
    implementation 'com.google.android.gms:play-services-ads:19.6.0'
}

AndroidManifest.xml 안에 애드몹 사이트에서 부여받는 앱 ID를 입력합니다. 여기서는 구글에서 테스트용으로 제공하는 ID를 입력하였습니다.

1
2
3
4
5
6
7
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-3940256099942544~3347511713" />
    </application>

다음은 화면에 광고를 표시하는 버튼을 추가합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<androidx.constraintlayout.widget.ConstraintLayout
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show AD"
        android:id="@+id/button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View Binding을 설정하고 애드몹 라이브러리를 초기화합니다. setRequestConfiguration을 사용해서 테스트용으로 사용할 기기에 대해서는 애드몹이 카운트하여 어뷰징으로 판단하지 않도록 제외하여 줍니다.

광고를 불러오는 작업은 loadRewardedAd에서 수행하고 광고를 표시하는 작업은 showRewardedAd에서 수행하도록 합니다. 또한 보상값을 저장하는 reward 전역변수도 만들어 줍니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private var mRewardedAd: RewardedAd? = null
    private var reward: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        MobileAds.initialize(this)
        val testDeviceIds = listOf("My device ID1", "My device ID2")
        MobileAds.setRequestConfiguration(
            RequestConfiguration.Builder()
                .setTestDeviceIds(testDeviceIds)
                .build()
        )

        loadRewardedAd()

        binding.button.setOnClickListener {
            showRewardedAd()
        }
    }
}

우선은 광고를 불러오는 부분을 작성하겠습니다.

adUnitId에는 애드몹 사이트에서 제공하는 전면광고 아이디를 기입합니다. 여기서는 구글에서 제공하는 테스트 ID를 사용했습니다.

그리고 RewardedAdLoadCallback의 인스턴스를 만들어서 loadAd에 바로 전달해줍니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
private fun loadRewardedAd() {
    val adRequest = AdRequest.Builder().build()

    mRewardedAd = RewardedAd(this, "ca-app-pub-3940256099942544/5224354917")
    mRewardedAd?.loadAd(adRequest, object : RewardedAdLoadCallback() {
        override fun onRewardedAdFailedToLoad(p0: LoadAdError?) {
            Log.d("TAG", p0!!.message)
            mRewardedAd = null
        }

        override fun onRewardedAdLoaded() {
            Toast.makeText(applicationContext, "Ad loading succeed", Toast.LENGTH_SHORT).show()
        }
    })
}

다음은 광고를 보여주는 부분입니다. 광고가 잘 불러와졌는지 콜백으로 확인하고 show로 표시하면 됩니다.

유저가 광고를 끝까지 시청하면 onUserEarnedReward가 실행되고, 보상을 p0로 전달받게 됩니다. 이 때 p0의 값은 Admob 사이트에서 지정한 type과 amount값입니다. 따라서 함수블럭 안에서 p0 값을 전달받아 기존 아이템 값에 반영되도록 하면 되는데 여기서는 텍스트뷰에 그 값을 표시하도록 하였습니다.

그리고 RewardedAdCallback 객체를 만들어서 show에 전달해주는데 이때 onRewardedAdClosed로 광고를 닫으면 다음광고를 다시 로딩하도록 합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private fun showRewardedAd() {
    if (mRewardedAd != null) {
        if (mRewardedAd!!.isLoaded) {
            mRewardedAd?.show(this, object : RewardedAdCallback() {
                override fun onUserEarnedReward(p0: RewardItem) {
                    Toast.makeText(applicationContext, "onUserEarnedReward", Toast.LENGTH_SHORT).show()
                    val rewardAmount = p0.amount
                    val rewardType = p0.type
                    reward += rewardAmount
                    binding.textview.text = "$rewardType : $reward"
                }

                override fun onRewardedAdClosed() {
                    loadRewardedAd()
                }

                override fun onRewardedAdFailedToShow(p0: AdError?) {
                    Log.d("TAG", p0!!.message)
                    mRewardedAd = null
                }

                override fun onRewardedAdOpened() {
                    Log.d("TAG", "onRewardedAdOpened")
                }
            })
        }
    }
}

Google Admob Version 19.7.0 이상에서의 구현

구현은 loadRewardedAdshowRewardedAd의 내용만 변경하면 됩니다. 우선 loadRewardedAd는 다음과 같이 변경됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
private fun loadRewardedAd() {
    val adRequest = AdRequest.Builder().build()

    RewardedAd.load(
        this, "ca-app-pub-3940256099942544/5224354917", adRequest, object : RewardedAdLoadCallback() {
            override fun onAdFailedToLoad(p0: LoadAdError) {
                Log.d("TAG", p0.message)
                mRewardedAd = null
            }

            override fun onAdLoaded(p0: RewardedAd) {
                Toast.makeText(applicationContext, "Ad loading succeed", Toast.LENGTH_SHORT).show()
                mRewardedAd = p0
            }
        }
    )
}

그리고 showRewardedAd는 다음과 같이 변경합니다. mRewardedAd 에 대해 null체크를 수행한 뒤 FullScreenContentCallback 프로퍼티를 작성해주고 show로 광고를 보여주면 됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private fun showRewardedAd() {
    if (mRewardedAd != null) {
        mRewardedAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
            override fun onAdDismissedFullScreenContent() {
                Log.d("TAG", "Ad was dismissed")
                mRewardedAd = null
                loadRewardedAd()
            }

            override fun onAdFailedToShowFullScreenContent(p0: AdError?) {
                Log.d("TAG", "Ad failed to show.")
            }

            override fun onAdShowedFullScreenContent() {
                Log.d("TAG", "Ad showed fullscreen content.")
                mRewardedAd = null
            }
        }
        mRewardedAd?.show(this, OnUserEarnedRewardListener() { rewardItem ->
            val rewardAmount = rewardItem.amount
            val rewardType = rewardItem.type
            reward += rewardAmount
            binding.textview.text = "$rewardType : $reward"
        })
    } else {
        Log.d("TAG", "The rewarded ad was not loaded yet")
    }
}

이렇게 해서 Google Admob 라이브러리로 앱에 보상형 광고를 표시하는 법에 대해 알아보았습니다.

Built with Hugo
Theme Stack designed by Jimmy