Kotlin

[Kotlin] Admob 적응형 배너 등록하는 방법

eulBlue 2023. 11. 25. 21:19

📱테스트 환경

Samsung Galaxy Android 13 • Android 10


https://developers.google.com/admob/android/quick-start?hl=ko#import_the_mobile_ads_sdk

 

시작하기  |  Android  |  Google for Developers

Android 앱을 제작 중인 Google AdMob 게시자를 위한 모바일 광고 SDK입니다.

developers.google.com

https://developers.google.com/admob/android/banner/anchored-adaptive?hl=ko#kotlin

 

앵커 적응형 배너  |  Android  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 앵커 적응형 배너 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 적응형 배너는 광고 크

developers.google.com

사실상 종속성 추가하고, 초기화까지는 공식문서보고해도 엄청 쉽기때문에 이게 목적이 아닐꺼다.

아마 가이드에 있는 적응형 배너 관련 함수들이 에러를 발생시켜서 검색해서 오는 사람들이 있을텐데, 그러면 4번부터 보면 된다.

01. bulid.gradle ( app ) 종속성 추가

dependencies {
    ...
    implementation 'com.google.android.gms:play-services-ads:22.5.0'
}

02. AndroidManifest.xml

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

여기서는 나중에는 발급받은 아이디를 사용하면되지만, 정지먹을 수 있기 때문에 테스트 광고 아이디값을 사용한다.

테스트 광고를 통해 구도를 잡고 나중에 배포하는 과정에서 아이디값을 변경해주면 된다.

03. Admob 광고 SDK 초기화

MobileAds.initialize(this) {}

04. 적응형 사이즈를 위한 getAdaptiveBannerAdSize.kt 함수 작성

@RequiresApi(Build.VERSION_CODES.R)
fun getAdaptiveBannerAdSize(context: Context, windowManager: WindowManager, adContainerView: FrameLayout): AdSize {
    val windowMetrics = windowManager.currentWindowMetrics
    val bounds = windowMetrics.bounds

    var adWidthPixels = adContainerView.width.toFloat()

    // If the ad hasn't been laid out, default to the full screen width.
    if (adWidthPixels == 0f) {
        adWidthPixels = bounds.width().toFloat()
    }

    val density = context.resources.displayMetrics.density
    val adWidth = (adWidthPixels / density).toInt()

    return AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, adWidth)
}

WindowManager 는 Admob 광고를 띄우면서 처음사용해봤는데 현재 윈도우의 메트릭스 정보를 획득하기 위해 사용 한다고 한다

windowManager.currentWindowMetrics →  현재 윈도우의 메트릭스 정보 획득

windowManager.bounds →  현재 윈도우의 경계 정보 획득

AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, adWidth) 현재 방향 적응형 배너 광고의 크기 획득

05. loadBanner.kt 함수 생성

@RequiresApi(Build.VERSION_CODES.R)
fun loadBanner(context: Context, windowManager: WindowManager, adContainerView: FrameLayout, adView: AdView) {
    adView.adUnitId = "ca-app-pub-3940256099942544/6300978111"

    adView.setAdSize(getAdaptiveBannerAdSize(context, windowManager, adContainerView))
    val adRequest = AdRequest
        .Builder()
        .build()
    adView.loadAd(adRequest)
}
adView.setAdSize(getAdaptiveBannerAdSize(context, windowManager, adContainerView))

아까 만든 함수로 광고 사이즈를 설정해준다. 아마 여기부분에서 setAdSize 가 아니라 adSize 함수가 가이드로 나와있을텐데 여기서

에러가 발생했을 것이다. ( 내가 그랬다 ) 다른데서 에러가 났을 수도 있지만 ...

adView.loadAd(adRequest) 를 통해서 광고를 로드해주면 적응형 광고가 보이게된다.

06. MainActivity.kt

adView = AdView(this)
        adContainerView = findViewById(R.id.adContainerView)
        adContainerView.addView(adView)
        adContainerView.viewTreeObserver.addOnGlobalLayoutListener {
            if (!initialLayoutComplete) {
                initialLayoutComplete = true
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                    loadBanner(this, windowManager, adContainerView, adView)
                }
            }
        }
        adView.adListener = object : AdListener() {
            override fun onAdLoaded() {
                super.onAdLoaded()
                val overlayView = findViewById<TextView>(R.id.overlayView)
                overlayView.visibility = View.GONE
            }
        }

해당 Activity 가서 loadBanner 를 호출해주면 광고가 연결되는걸 확인해줄 수 있다.

나는 overlayView 를 생성해서 FrameLayout 로 겹치게 설정해서 광고가 로드 전 임의의 뷰를 보여줄 수 있도록 해놨다.

광고가 로드되면 View.GONE 처리를 통해서 overlayView 를 숨겨주고 광고만 보이도록 설정했다.