이번 포스팅에서는 보상형 광고를 표시하는 법에 대해 알아보도록 하겠습니다. 보상형 광고란 광고를 본 댓가로 어떤 아이템이나 보상을 주는 형태의 광고를 말합니다.
우선은 애드몹 디펜던시를 추가합니다. 현재 애드몹 라이브러리의 최신버전은 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 이상에서의 구현
구현은 loadRewardedAd와 showRewardedAd의 내용만 변경하면 됩니다. 우선 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 라이브러리로 앱에 보상형 광고를 표시하는 법에 대해 알아보았습니다.
VIDEO