Mobile 개발/Android&IOS

안드로이드 admob 광고 넣기 및 오류 해결

히핑소 2020. 7. 8. 19:12
반응형

Android 기준, mobile app에 에 전면 및 배너 광고 넣는 법 입니다.

 

먼저 admob https://admob.google.com/ - 앱 - 광고 단위에 들어갑니다. 

광고가 없으면 '광고 단위 추가' 로 추가합니다. 

배너, 전면 등 중복 광고 단위도 허용 가능합니다.

여기서 중요한게, 광고 종류별로 id가 다르니 꼭 기록해놓습니다.

string.xml 에 기록해놓으면 정리가 잘 되기 때문에, 아래와 같이 정의하는 것도 좋은 방법인 것 같습니다.

3개의 id 중

- admob_app_id 는 AndroidManifest.xml 에

- banner 는 xml 에 view layout을 정의하고 onCreate() 안에 코드도 넣습니다.

- interstitial 전면 광고는 onCreate() 에만 넣습니다. (xml은 없음)

        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="@string/admob_app_id"/>

 

            <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"
                android:layout_centerHorizontal="true"
                android:layout_alignParentBottom="true"
                ads:adSize="BANNER"
                ads:adUnitId="@string/admob_banner_app_id">
            </com.google.android.gms.ads.AdView>

 

MobileAds 를 initialize() 해주고 각각 전면, 배너 AdView 를 init 해줍니다.

전면 광고는 MainActivity 에서 back key 로 app 종료 시 띄울 목적이기 때문에

onBackPressed() 에 isLoad 인지 체크한 후 setAdLoad 하도록 구현했습니다.

import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.InterstitialAd;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private InterstitialAd mInterstitialAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        .
        .
        .
        MobileAds.initialize(this, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
            }
        });
        initInterstitialAdView();
        initBannerAdView();
    }

    private void initInterstitialAdView() {
        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId(getString(R.string.admob_interstitial_app_id));
        mInterstitialAd.loadAd(new AdRequest.Builder().build());
        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {}
            @Override
            public void onAdFailedToLoad(int errorCode) {
                Log.d(TAG, "on ad failed to load code : " + errorCode);
            }
            @Override
            public void onAdOpened() {}
            @Override
            public void onAdClicked() {}
            @Override
            public void onAdLeftApplication() {}
            @Override
            public void onAdClosed() {}
        });
    }

    private void initBannerAdView() {
        AdView adView = findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest.Builder().build();
        adView.loadAd(adRequest);
        adView.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() { }
            @Override
            public void onAdFailedToLoad(int errorCode) {
                // Code to be executed when an ad request fails.
                Log.d(TAG, "onAdFailedToLoad " + errorCode);
            }
            @Override
            public void onAdOpened() { }
            @Override
            public void onAdClicked() {}
            @Override
            public void onAdLeftApplication() {}
            @Override
            public void onAdClosed() {}
        });
    }

    @Override
    public void onBackPressed() {
        if (mInterstitialAd.isLoaded()) {
            setAdLoad();
        } else {
            super.onBackPressed();
        }
    }

    private void setAdLoad() {
        mInterstitialAd.show();
        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdClosed() {
                finish();
            }
        });
    }
}

 

만약, app_id 를 잘못넣거나 배너 & 전면광고와 id의 매칭이 잘못되면 아래와 같은 log가 발생합니다.

Ads     : Ad failed to load : 1 

  • 0 : ERROR_CODE_INTERNAL_ERROR : 광고 서버에서 잘못된 응답을 받는 등 내부적으로 오류가 발생했다는 의미입니다.
  • 1 : ERROR_CODE_INVALID_REQUEST : 광고 단위 ID가 잘못된 경우처럼 광고 요청이 잘못되었다는 의미입니다.
  • 2 : ERROR_CODE_NETWORK_ERROR : 네트워크 연결 문제로 인해 광고 요청에 성공하지 못했다는 의미입니다.
  • 3 : ERROR_CODE_NO_FILL : 광고 요청에는 성공했지만, 광고 인벤토리가 부족하여 광고가 반환되지 않았다는 의미입니다.

https://developers.google.com/admob/android/interstitial

onAdFailedToLoad 3 Error -  https://yannichoongs.tistory.com/46

 

Google admob onAdFailedToLoad 3 오류

admob 광고를 게재한 App 을 market 에 release 하고 이용중에 갑자기 광고가 안나왔고 logcat 확인해보니 onAdFailedToLoad 3 이 확인되었습니다. 여러 이유가 있을 수 있는데 - admob server 문제 - admob 광고..

yannichoongs.tistory.com

그리고, 마지막으로 build.gradle app 에 아래 dependencies 를 꼭 추가해줘야 합니다.

implementation 
'com.google.android.gms:play-services-ads:19.1.0'

 

P.S Banner 광고 Height 를 알 고 싶다면 아래 api 로 얻어올 수 있습니다.

int adHeight = AdSize.BANNER.getHeightInPixels(this);

 

반응형