[Must Have Joyce의 안드로이드 앱프로그래밍] 13장 미세먼지 앱 V 3.0: 구글 애드몹 광고, 파이어베이스, 구글 애널리틱스

알린·2024년 2월 2일
0

파이어베이스

  • 앱, 웹 개발에 사용하는 서비스를 통합해 제공하는 클라우드 플랫폼
    • 파이어스토어 (NoSQL 서비스)
    • 클라우드 메시징 (푸시 메시지 기능)
    • 구글 애널리틱스 (사용자 분석, 통계 툴)

파이어베이스 사용

  1. 다음 링크에서 [시작하기] 클릭
    파이어베이스 홈페이지
  2. [프로젝트 만들기] ➡️ 프로젝트명 입력 후 계속 동의 누르기 ➡️ 다음 계정으로 선택 ➡️ [Firebase 추가]
  3. 안드로이드 선택해 플랫폼을 프로젝트에 추가
  4. 다음처럼 작성 후 [앱 등록]
  5. json 파일 다운로드
  6. 안드로이드 스튜디오 [Project]에서 [app] 내에 5에서 다운받은 json 파일 복사, 붙여넣기로 넣기
  7. kotlin DSL로 선택해 나온 코드 중 위의 코드는 프로젝트 수준 build.gradle에 붙여넣기, 아래 코드는 모듈수준 build.gradle에 붙여넣기 ➡️ [다음] ➡️ [콘솔로 이동]

    👉 파이어베이스 라이브러리 관련 공식 문서

애널리틱스 확인하기

  • [애널리틱스] ➡️ [Dashboard]

애드몹

애드몹 시작하기

  1. 다음 페이지에서 회원가입
    👉 애드몹 홈페이지

  2. [홈] ➡️ [시작하기]

  3. 다음으로 선택 후 [계속] ➡️ [완료]

  4. [앱] ➡️ [광고단위] ➡️ [시작하기] ➡️ 배너광고 선택 ➡️ 광고 단위 이름 작성 ➡️ [광고 단위 만들기]

  5. 생성되는 두 가지 중 아래의 ID를 따로 복사하여 저장해두기 ➡️ [완료]

  6. [앱] ➡️ [앱 설정] ➡️ [앱ID] 복사

  7. 안드로이드 스튜디오 매니패스트 파일의 application 태그 내에 다음 코드 추가

        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="방금 복사한 앱 ID 넣기" />
  1. 모듈 수준 build.gradle에 다음 코드 추가
implementation("com.google.android.gms:play-services-ads:22.6.0")

코드 작성

  1. 광고 넣을 액티비티의 xml에 다음 코드 작성
    <com.google.android.gms.ads.AdView xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:id="@+id/adView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ads:adSize="BANNER"
        ads:adUnitId="광고 단위 ID 넣기"
        ads:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

🚨 테스트 시 꼭 테스트 광고 단위 ID 사용하기

  • 애드몹에서 승인을 받지 않고 광고 단위 ID를 사용하면 앱 실행 시 광고가 보이지 않고,
    승인을 받았더라도 테스트 시에 실제 광고 단위 ID를 사용하게 되면 계정 자체가 정지될 수 있음
  • 테스트용 광고 단위 ID는 아래 링크에서 확인 가능
    👉 안드로이드용 테스트 광고 단위 ID 공식 문서
  1. 광고를 넣을 액티비티에 다음 함수 작성 후 onCreate() 함수에 setBannerAds() 함수 추가
    // 전면 광고 설정 변수
    var mInterstitialAd : InterstitialAd? = null
    
    // 전면 광고 다시 로드하는 함수
    override fun onResume() {
        super.onResume()
        setInterstitialAds()
    }
    
    // 플로팅 버튼 클릭했을 때 전면 광고 나오는 함수![](https://velog.velcdn.com/images/yesue/post/1a29a829-3411-4eb7-961a-bbdf57773a84/image.mp4)

    private fun setFab() {
        binding.fab.setOnClickListener {
            if (mInterstitialAd != null) {  // 변수에 fullScreenContentCallback 인터페이스 등록 => 전면 광고가 닫히고 열렸을 때, 실패했을 때를 콜백 함수로 확인할 수 있음
                mInterstitialAd!!.fullScreenContentCallback = object: FullScreenContentCallback() {
                    override fun onAdDismissedFullScreenContent() {
                        Log.d("ads log", "전면 광고가 닫혔습니다.")

                        val intent = Intent(this@MainActivity, MapActivity::class.java)
                        intent.putExtra("currentLat", latitude)
                        intent.putExtra("currntLng", longitude)
                        // startMapActivityResult.launch() : 지도 페이지로 이동하고, 등록해둔 onActivityResult 콜백에 보낸 값이 전달
                        startMapActivityResult.launch(intent)
                    }

                    override fun onAdFailedToShowFullScreenContent(adError: AdError) {
                        Log.d("ads log", "전면 광고가 열리는 데 실패 ${adError.message}")
                    }

                    override fun onAdShowedFullScreenContent() {
                        Log.d("ads log", "전면 광고가 성공적으로 열렸습니다.")
                        mInterstitialAd = null  // 전면 광고는 재사용이 어렵기 때문에 null로 만들어주기
                    }
                }
                mInterstitialAd!!.show(this@MainActivity)
            } else {
                Log.d("InterstitialAd", "전면 광고가 로딩되지 않았습니다.")
                Toast.makeText(this@MainActivity, "잠시 후 다시 시도해주세요.", Toast.LENGTH_SHORT).show()
            }
        }
    }
    // 배너 광고 설정 함수
    private fun setBannerAds() {
        MobileAds.initialize(this) // 구글 모바일 광고 SDK 초기화
        val adRequest = AdRequest.Builder().build()  // AdRequest 객체 생성 => 광고 요청에 대한 타깃팅 정보 있음
        binding.adView.loadAd(adRequest) // 애드뷰에 광고 로드
        
        // 애드뷰 리스너
        binding.adView.adListener = object  : AdListener() {
            override fun onAdLoaded() {
                Log.d("ads log", "배너 광고가 로드되었습니다.")  
            }

            override fun onAdFailedToLoad(adError: LoadAdError) {
                Log.d("ads log", "배너 광고가 로드 실패했습니다. ${adError.responseInfo}")
            }

            override fun onAdOpened() {
                Log.d("ads log", "배너 광고를 열었습니다.")
            }

            override fun onAdClicked() {
                Log.d("ads log", "배너 광고를 클릭했습니다.")
            }

            override fun onAdClosed() {
                Log.d("ads log", "배너 광고를 닫았습니다.")
            }
        }
    
    
    // 전면 광고 설정 함수
    private fun setInterstitialAds() {
        val adRequest = AdRequest.Builder().build()

        InterstitialAd.load(this, "ca-app-pub-3940256099942544/1033173712", adRequest, object : InterstitialAdLoadCallback() {
            override fun onAdFailedToLoad(adError: LoadAdError) {
                Log.d("ads log", "전면 광고가 로드 실패했습니다. ${adError.responseInfo}")
                mInterstitialAd = null
            }

            override fun onAdLoaded(interstitialAd: InterstitialAd) {
                Log.d("ads log", "전면 광고가 로드되었습니다.")
                mInterstitialAd = interstitialAd
            }
        })
    }

광고 구현 결과

배너 광고

전면 광고

profile
Android 짱이 되고싶은 개발 기록 (+ ios도 조금씩,,👩🏻‍💻)

0개의 댓글