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で指定する一部のタグでエラーが発生してしまうので注意。
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); } } }