게임 개발/Cocos2d-x

Adlib 에 구글플레이서비스의 애드몹 적용하기

날개 2014. 3. 7. 13:52

아마 구글 애드몹 또는 애드립(www.adlibr.com)을 사용하시는 분들 많이 있을 것 같습니다.


어제 요즘 작업하고 있는 프로젝트에 구글 플레이의 게임 서비스들을 붙여보려고 어제 시도를 했었는데요, 구글 개발자사이트의 안내대로 게임 서비스를 적용하는 작업중, 아래와 같은 에러가 발생 하더군요.


빌드 자체에서는 에러가 났다 안났다 하는데 (이클립스가 참 이랬다 저랬다 하네요...), 실제로 실행을 시키려 하면 아래와 같은 에러가 반드시 나더군요.



[2014-03-07 16:04:23 - Dex Loader] Unable to execute dex: Multiple dex files define Lcom/google/ads/AdRequest$ErrorCode;

[2014-03-07 16:04:23 - peachX.android] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/google/ads/AdRequest$ErrorCode;


어떻게 해결해야 할지, 구글을 찾아보았으나 구글에서 검색된 내용으로는 해결이 안되고, 아는 분들과 얘기를 나누던중, 구글 플레이 서비스 SDK의 최신 버전에 구글 애드몹이 포함되어 있을것이다라는 얘기를 듣고, 구글 개발자 사이트를 확인해 보니.... 역시 애드몹에 구글 플레이 서비스에 포함이 되어 있더군요.


결국, 기존에 애드몹을 적용시킨것과 중복 충돌이 난겁니다. --;


구글 플레이 게임서비스를 사용하려면, 기존의 애드몹 라이브러리를 사용하지 못하는겁니다. 그래서 애드몹 라이브러리인 GoogleAdMobAdsSdk-6.4.1.jar 를 제거하고, 구글 플레이 서비스에 포함된 애드몹을 적용해 보기로 했습니다.


구글 사이트에 가면 구글 플레이 서비스에 포함된 애드몹을 사용하는 방법이 잘 나와 있으니 그대로 따라하면 될 것이고요, 아래에는 Adlib SDK에 구글 플레이 서비스 내의 애드몹을 적용하는 방법을 적어 둡니다.

(사실 별 차이는 없습니다. 네이밍 바뀐것과 매니페스트 XML, 리스터 메소드 변경등만 하면 됩니다.)



1. 환경 설정


먼저 구글 플레이서비스를 다운로드 받고 본인 프로젝트에 임포트 합니다. (구글 플레이서비스는 ADT에서 Extra 항목에서 다운로드 받을 수 있습니다. 다운로드 받으면 본인 android-sdk 디렉터리 아래의 extra 디렉터리에 받아지는데, extras/google/google_play_services/libproject/google-play-services_lib 만 임포트합니다. 임포트할때는 반드시 Copy 옵션으로 본인 프로젝트 하위로 복사하게끔 해서 사용해야 합니다.)


프로젝트 매니페스트 XML의 application 엘리먼트 내에 아래와 같이 메타데이터 엘리먼트를 추가합니다.


    <meta-data android:name="com.google.android.gms.version"

               android:value="@integer/google_play_services_version"/>


프로젝트 매니페스트 XML에 아래와같이 application 엘리먼트 내에 애드몹 광고 액티비티를 추가합니다.


<activity android:name="com.google.android.gms.ads.AdActivity"

             android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>


프로젝트 매니페스트 XML에 아래의 권한들을 추가합니다.


<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


위 과정은, https://developers.google.com/mobile-ads-sdk/docs/에 자세히 설명되어 있습니다.



2. 적용 작업


먼저 Adlib SDK를 설치 합니다. (설치 하는 방법은 Adlib 사이트를 참조)


애드립에서 제공하는 SubAdlibAdViewAdmob.java 파일을, SubAdlibAdViewGooglePlayAdmob.java로 이름을 변경합니다. (변경하지 않아도 되지만, 저는 오리지널 파일과 구분하기 위해 변경했습니다.)


SubAdlibAdViewGooglePlayAdmob.java 의 전체 소스는 아래와 같습니다.

(저는 배너광고만 테스트했습니다. Interstitial형태의 광고가 필요하신분은 아래에 기본코드는 넣어 두었으나 테스트해보지 못했으므로 직접 테스트해보시고 수정해서 사용하시면 되겠습니다.)



package org.cocos2dx.cpp.ads;    // 적절히 바꾸세요.


import com.google.android.gms.ads.*;


import com.mocoplex.adlib.AdlibManager;

import com.mocoplex.adlib.SubAdlibAdViewCore;


import android.app.Activity;

import android.content.Context;

import android.os.Handler;

import android.os.Message;

import android.util.AttributeSet;

import android.view.Gravity;


public class SubAdlibAdViewGooglePlayAdmob extends SubAdlibAdViewCore  {

protected AdView adView;

protected boolean bGotAd = false;

// 여기에 ADMOB ID 를 입력하세요.

static String admobID = "여기에 ADMOB ID 입력";

    

public SubAdlibAdViewGooglePlayAdmob (Context context) {

this (context,null);

}

public SubAdlibAdViewGooglePlayAdmob (Context context, AttributeSet attrs) {

super (context, attrs);

initAdmobView ();

}

public void initAdmobView ()

{

adView = new AdView ((Activity) this.getContext ());

adView.setAdSize (AdSize.BANNER);

adView.setAdUnitId (admobID);

// 광고 뷰의 위치 속성을 제어할 수 있습니다.

this.setGravity (Gravity.CENTER);

adView.setAdListener (new AdListener () {


@Override

public void onAdLoaded () {


bGotAd = true;

queryAd ();

// 광고를 받아왔으면 이를 알려 화면에 표시합니다.

gotAd ();

}


@Override

public void onAdFailedToLoad (int errorCode) {

bGotAd = true;

failed ();

}


@Override

public void onAdOpened () {

}


@Override

public void onAdClosed () {

}


@Override

public void onAdLeftApplication () {

}


});

}

private  AdRequest request = new AdRequest.Builder ()

.addTestDevice (AdRequest.DEVICE_ID_EMULATOR)

.build ();

    

// 스케줄러에의해 자동으로 호출됩니다.

// 실제로 광고를 보여주기 위하여 요청합니다.

public void query () {

if (adView == null) {

initAdmobView ();

}

        this.removeAllViews ();

this.addView (adView);

adView.loadAd (request);

        

        // 5초 이상 리스너 응답이 없으면 다음 플랫폼으로 넘어갑니다.

Handler adHandler = new Handler ();

adHandler.postDelayed (new Runnable () {

            

@Override

public void run () {

if (bGotAd) {

return;

} else {

failed ();

                    if (adView != null) {

                        SubAdlibAdViewGooglePlayAdmob.this.removeView (adView);

                        adView.destroy();

                        adView = null;

                    }

                    bGotAd = false;

}

}

            

}, 5000);

}

public void onDestroy () {

if (adView != null) {

this.removeView (adView);

adView.destroy ();

adView = null;

}

super.onDestroy ();

}

public void clearAdView () {

if (adView != null) {

        this.removeView (adView);

}

        super.clearAdView ();

}

public void onResume () {

        super.onResume ();


        if (adView != null) {

        adView.resume ();

        }

}

public void onPause () {

if (adView != null) {

adView.pause ();

}

        super.onPause ();

}

public static void loadInterstitial (Context ctx, final Handler h)

{

// Create the interstitial

final InterstitialAd interstitial = new InterstitialAd ((Activity)ctx);

interstitial.setAdUnitId (admobID);


   // Create ad request

AdRequest adRequest = new AdRequest.Builder ().build ();


   // Begin loading your interstitial

   interstitial.loadAd (adRequest);


   // Set Ad Listener to use the callbacks below

   interstitial.setAdListener (new AdListener () {

   

@Override

public void onAdLoaded () {


if (interstitial.isLoaded ()) {

if (h != null) {

h.sendMessage (Message.obtain (h, AdlibManager.DID_SUCCEED, "ADMOB"));

}

interstitial.show ();

}

}


@Override

public void onAdFailedToLoad (int errorCode) {

if (h != null) {

h.sendMessage (Message.obtain (h, AdlibManager.DID_ERROR, "ADMOB"));

}

}


@Override

public void onAdOpened () {

}


@Override

public void onAdClosed () {

if (h != null) {

h.sendMessage (Message.obtain (h, AdlibManager.INTERSTITIAL_CLOSED, "ADMOB"));

}

}


@Override

public void onAdLeftApplication () {

}


   });

}

}




모코플렉스(애드립제작사)측에서 수정버전 나오기 전까지는 이렇게 사용하면 될 것 같습니다.





끝.