いくつかの理由から、広告をnendからAdMobに切り替えることにしました。
いえ、大した理由では無いです。半分くらい好みの問題です。
AdMobは情報が多そうだし、
簡単だろうと考えていたら丸一日ドハマりしてしまったので、
自分のためにもここに記録しておきます。
ドハマりした原因は恐らく
- AndEngineを使用している(それも教本に従って)
- AndEngineのViewを画面一杯に表示している
- レイアウトをactivity_main.xmlだけで管理している
- そもそもAndroid開発もAndEngineもまだ良く分かっていない
辺りではないかと思います。
そして解決のポイントになったのは
- AdViewを読み込む場所
- activity_main.xmlのレイアウトの仕方
です。
基本的な手順はこちらのガイドに従います。
上記はEclipseでの手順なのでAndroid Studioの方は
左の「スタートガイド」→「Android Studio」を参照してください。
検索すると、AdMobのSDKをダウンロードして云々と書かれていることもありますが、
現在はGoogle Play Serviceに含まれているようなので
Google Play ServiceをSDK Managerでインストールしておきましょう。
無事にGoogle Play 開発者サービス ライブラリへの参照が出来たら次に進みます。
マニフェストファイルは特に変わりなく、ガイド通りに追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.narumiem.RainbowHeartCrush" android:versionCode="1" android:versionName="1.0" android:installLocation="auto"> <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="21" /> <!-- Include required permissions for Google Mobile Ads to run--> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar" > <!--This meta-data tag is required to use Google Play Services.--> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <activity android:name="com.narumiem.RainbowHeartCrush.MainActivity" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--Include the AdActivity configChanges and theme. --> <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent"/> </application> </manifest> |
広告ユニットIDもガイド通りです。
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">レインボー ハート クラッシュ</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <!-- AdMob広告ユニットID --> <string name="banner_ad_unit_id">ca-app-pub-3940256099942544/6300978111</string> </resources> |
上記の「ca-app-pub-3940256099942544/6300978111」はテスト用なので、
とりあえず最初はこれを入れておくと良いでしょう。
そして、ここからが本題です。
activity_main.xmlでレイアウトを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:ads="http://schemas.android.com/apk/res-auto" android:id="@+id/myLayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.narumiem.RainbowHeartCrush.MainActivity" > <org.andengine.opengl.view.RenderSurfaceView android:id="@+id/renderview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom|center" android:orientation="vertical" > <com.google.android.gms.ads.AdView android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" ads:adSize="BANNER" ads:adUnitId="@string/banner_ad_unit_id" > </com.google.android.gms.ads.AdView> </LinearLayout> </FrameLayout> |
「xmlns:ads=”http://schemas.android.com/apk/res-auto”」の追加はガイド通りです。
「com.google.android.gms.ads.AdView~」部分をLinearLayoutで囲み、
全体はFrameLayoutに変更します。
これでAndEngineのViewにAdMobのバナー広告が重ねて表示されます。
バナー広告の位置はLinearLayoutの「android:gravity=”bottom|center”」で指定出来ますが、
細かい調整はxmlを編集するより、Graphical Layoutで行った方が楽かと思います。
最後に、MainActivityで広告を読み込みます。
教本ではonCreateSceneで読み込んでいますが、onCreateで読み込みます。
しかし、教本に従って作っていると、
MainActivityにはonCreateもonDestroyも無いので、
まずこの2つを作ってあげます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
... public class MainActivity extends MultiSceneActivity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onDestroy(){ super.onDestroy(); } ... } |
ここにAdViewを読み込むコードを追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
... import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdView; ... public class MainActivity extends MultiSceneActivity { //広告表示スペース private AdView adView; ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //広告の読み込み adView = (AdView)findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder().build(); adView.loadAd(adRequest); } @Override public void onDestroy(){ //広告の破棄 if(adView != null){ adView.destroy(); } super.onDestroy(); } ... } |
追記したコードは教本とガイドの両方を参考にしました。
初めはRelativeLayoutを使っていて、エラーは出ないのに表示されないとか、
onCreateSceneで読み込むとエラーが出てしまうとかでハマってました。
じゃあonCreateを作れば、ということで試したら
setContentView(R.layout.activity_main);
が入っていたせいでエラーが出ていることにずっと気付かず右往左往。
そんな中あれこれ試しながら原因探って見つけたのが今回のやり方です。
本当はonPauseとかonResumeでもやることはあるかと思うのですが、
今回は表示されたので、ひとまずここまでということで。
これで実行すると画面下にテスト用バナーが表示されるはずです。
ちなみに、画像は今開発中のパズルゲームです。
内容はTriple Townのパクリオマージュです。
パズルゲーム部分はほぼ完成しているので、
あとはUI描いたり、アニメーションのコード書いたり、
オプション画面作ったり、スコア機能入れたり、
チュートリアル作ったりといった感じです。
こうして並べるとまだまだやる事ありますね…。
UI作るのが何気にしんどいです。
センスも技術も無いのでちっとも思い浮かびません。
ゲームUIの作り方が書かれた本でもあれば…。