読者です 読者をやめる 読者になる 読者になる

プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

Cocos2d-xにAdMob (バナー) を導入する方法 - Android編

cocos2d-xでは何か特別な処理が必要なのかなと思っていたけれど、バナー表示のみであればiOSとAndroid、プラットフォーム毎に個別対応をして起動時に表示するだけでよいらしい。ということで普通にそれぞれのアプリを開発するのと同じ手順を踏めばOK。(ステータスなどによって表示と非表示を切り替えようとするとNDKでの処理が必要になるのでちょっと面倒くさい)

AdMobの導入

Google Mobile Ads SDKはGoogle Play servicesに統合されたので、Google Play servicesをインポートしてプロジェクトにライブラリとして追加するだけで準備OK。

Google Play servicesのインポート

Androidのバージョンを5.1.1(API Level=22)にして、Google Play servicesをSDK配下のパスから選択して追加する(/(Android SDKのパス)/extras/google/google_play_services)。Androidのバージョンに関してはAPI Level 13以上にしないとAndroidManifestで指定する一部のタグでエラーが発生してしまうので注意。

f:id:ntaku:20150503201516p:plain

AndroidManifest.xml

パーミッションとActivityを追加

<!-- Permissions for Ads-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- Activity for AdMob-->
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" />

AppActivity.java

通常であればXMLのレイアウトファイルを編集してバナーを追加するが、cocos2d-xの場合はコードで書く方法が主流っぽい感じだったので、Cocos2dxActivityを継承しているorg.cocos2dx.cpp.AppActivityにコードを追加する。とりあえずこの内容でフッタ位置にバナーが表示されるようになる。

package org.cocos2dx.cpp;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.cocos2dx.lib.Cocos2dxActivity;
import android.annotation.TargetApi;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;

public class AppActivity extends Cocos2dxActivity {

  private static AdView adView;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // レイアウト設定
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    int width = getDisplaySize(getWindowManager().getDefaultDisplay()).x;
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(width, LinearLayout.LayoutParams.WRAP_CONTENT);
    layoutParams.gravity = (Gravity.BOTTOM | Gravity.CENTER);

    // AdMobView追加
    adView = new AdView(this);
    adView.setAdUnitId("ca-app-pub-xxxx/xxxx");
    adView.setAdSize(AdSize.BANNER);
    adView.setBackgroundColor(Color.WHITE);
    addContentView(adView, layoutParams);

    // リクエスト開始
    AdRequest adRequest = new AdRequest.Builder().build();
    adView.loadAd(adRequest);
  }

  @Override
  protected void onResume() {
    super.onResume();
    if (adView != null) {
      adView.resume();
    }
  }

  @Override
  protected void onPause() {
    if (adView != null) {
      adView.pause();
    }
    super.onPause();
  }

  @Override
  protected void onDestroy() {
    adView.destroy();
    super.onDestroy();
  }

  // ディスプレイサイズを取得するためのヘルパー
  @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
  private Point getDisplaySize(Display d) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
      Point p = new Point(0, 0);
      d.getSize(p);
      return p;
    }
    try {
      Method getWidth = Display.class.getMethod("getWidth", new Class[] {});
      Method getHeight = Display.class.getMethod("getHeight", new Class[] {});
      return new Point(
          ((Integer) getWidth.invoke(d, (Object[]) null)).intValue(),
          ((Integer) getHeight.invoke(d, (Object[]) null)).intValue());
    } catch (NoSuchMethodException e2) {
      return new Point(-1, -1);
    } catch (IllegalArgumentException e2) {
      return new Point(-2, -2);
    } catch (IllegalAccessException e2) {
      return new Point(-3, -3);
    } catch (InvocationTargetException e2) {
      return new Point(-4, -4);
    }
  }
}

f:id:ntaku:20150503201652p:plain

参考

ntaku.hateblo.jp