2016年01月13日

Cocos2d-X、AndroidでAdMobの広告を表示する

概要

Cocos2d-x、AndroidでAdMobの広告を表示する方法についてのメモです。

次のような流れで書いていきます。AdMob側の設定は済んでいる事を前提としています。

  1. Google Repositoryをインストールする。
  2. AdMobのライブラリをバンドルする。
  3. パーミッションの設定を行う。
  4. メタデータの設定と広告アクティビティの設定を行う。
  5. 広告ユニットIDをリソースに追加する。
  6. バナー広告を作成する処理を作成する。
  7. バナー広告の表示、非表示を切り替える処理を作成する。
  8. インタースティシャル広告を表示する処理を作成する。
  9. C++からJavaを呼び出す処理を作成する。
  10. テストデバイスの設定を行う。

Google Repositoryをインストールする

Android StudioのSDK ManagerからGoogle Repositoryをインストールします。

AdMobのライブラリをバンドルする

build.gradleを編集して、AdMobのライブラリをバンドルします。

dependencies {
    ...
    compile 'com.google.android.gms:play-services-ads:8.4.0'
}

パーミッションの設定を行う

AndroidManifest.xmlのmanifestタグにパーミッションの設定を追記します。

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

メタデータの設定と広告アクティビティの設定を行う

AndroidManifest.xmlのapplicationタグにメタデータの設定と広告アクティビティの設定を追記します。

<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" />

広告ユニットIDをリソースに追加する

AdMobから割り振られる広告ユニットIDをres/valuesに追加します。ここではbanneradunit_idという名前で追加しました。

<string name="banner_ad_unit_id">ca-app-pub-*****</string>

バナー広告を作成する処理を作成する

onCreateでバナー広告を作成する処理を作成します。

テストデバイスIDのところは後述します。

import android.widget.LinearLayout;
import android.view.Gravity;

    /** バナー広告 */
    private AdView mAdView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        ...

        // 広告ビューのレイアウトパラメータを作成する
        LinearLayout.LayoutParams adParams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);

        // 表示位置を左上に設定する
        adParams.gravity = (Gravity.TOP | Gravity.LEFT);

        // 広告ビューを作成する
        mAdView = new AdView(this);
        mAdView.setAdSize(AdSize.BANNER);
        mAdView.setAdUnitId(getString(R.string.banner_ad_unit_id));

        // テストデバイスのIDを指定してAdRequestを作成する
        AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .addTestDevice(getString(R.string.test_device_id))
                .build();

        // 広告を読み込む
        mAdView.loadAd(adRequest);

        // 広告ビューをアクティビティに追加する
        addContentView(mAdView, adParams);
    }

バナー広告の表示、非表示を切り替える処理を作成する

ゲームのプレイ画面では広告を表示せずに、ポーズ画面などで表示させるような場合のために、表示・非表示を切り替えることができるようにします。

C++から呼べるようにstatic関数で作成します。

import android.view.View;

    /**
     * バナー広告を表示する。
     */
    public static void viewAdBanner() {

        // 広告表示切替のスレッドを開始する
        me.runOnUiThread(new Runnable() {

            @Override
            public void run() {

                // 広告が無効な場合は有効にする
                if (!me.mAdView.isEnabled()) {
                    me.mAdView.setEnabled(true);
                }

                // 広告が表示でない場合は表示にする
                if (me.mAdView.getVisibility() != View.VISIBLE) {
                    me.mAdView.setVisibility(View.VISIBLE);
                }
            }
        });
    }

    /**
     * バナー広告を非表示にする。
     */
    public static void hideAdBanner() {

        // 広告表示切替のスレッドを開始する
        me.runOnUiThread(new Runnable() {

            @Override
            public void run() {

                // 広告が有効な場合は無効にする
                if (me.mAdView.isEnabled()) {
                    me.mAdView.setEnabled(false);
                }

                // 広告が非表示でない場合は非表示にする
                if (me.mAdView.getVisibility() != View.INVISIBLE) {
                    me.mAdView.setVisibility(View.INVISIBLE);
                }
            }
        });
    }

インタースティシャル広告を表示する処理を作成する

インタースティシャル広告を表示する処理を作成します。onCreateで事前にインタースティシャル広告の要求をしておいて、表示する時にラグが発生しないようにします。

広告を閉じると次の広告を要求するようにします。

広告の表示はC++から呼べるようにstatic関数で作成します。

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

    /** インタースティシャル広告 */
    private InterstitialAd mInterstitialAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        ...

        // インタースティシャル広告を作成する
        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId(getString(R.string.banner_ad_unit_id));
        requestNewInterstitial();

        // インタースティシャル広告を閉じた時に次の広告を読み込むためにリスナーを登録する
        mInterstitialAd.setAdListener(new AdListener() {

            @Override
            public void onAdClosed() {
                requestNewInterstitial();
            }
        });
    }
    
    /**
     * インタースティシャル広告を表示する。
     */
    public static void viewAdInterstitial() {

        // 広告表示のスレッドを開始する
        me.runOnUiThread(new Runnable() {

            @Override
            public void run() {

                // 広告が読み込まれている場合は広告を表示する
                if (me.mInterstitialAd.isLoaded()) {
                    me.mInterstitialAd.show();
                }
            }
        });
    }

    /**
     * インタースティシャル広告を要求する。
     */
    private void requestNewInterstitial() {

        // テストデバイスのIDを指定してAdRequestを作成する
        AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .addTestDevice(me.getString(R.string.test_device_id))
                .build();

        // 広告を読み込む
        mInterstitialAd.loadAd(adRequest);
    }

C++からJavaを呼び出す処理を作成する

C++からJavaを呼び出す処理を作成します。

#include <assert.h>
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#define JNICLASSNAME "org/cocos2dx/cpp/AppActivity"

using cocos2d::JniMethodInfo;
using cocos2d::JniHelper;

// バナー広告表示
void Advertisement::viewBanner()
{
    // ネイティブコードのバナー広告表示関数を取得する
    JniMethodInfo methodInfo;
    if (!JniHelper::getStaticMethodInfo(methodInfo, JNICLASSNAME, "viewAdBanner", "()V"))
    {
        assert(false);
        return;
    }
    
    // 関数を呼び出す
    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
    
    // リソースを解放する
    methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
    
// バナー広告消去
void Advertisement::hideBanner()
{
    // ネイティブコードのバナー広告表示関数を取得する
    JniMethodInfo methodInfo;
    if (!JniHelper::getStaticMethodInfo(methodInfo, JNICLASSNAME, "hideAdBanner", "()V"))
    {
        assert(false);
        return;
    }
    
    // 関数を呼び出す
    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
    
    // リソースを解放する
    methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
    
// インタースティシャル広告表示
void Advertisement::viewInterstatial()
{
    // ネイティブコードのバナー広告表示関数を取得する
    JniMethodInfo methodInfo;
    if (!JniHelper::getStaticMethodInfo(methodInfo, JNICLASSNAME, "viewAdInterstitial", "()V"))
    {
        assert(false);
        return;
    }
    
    // 関数を呼び出す
    methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
    
    // リソースを解放する
    methodInfo.env->DeleteLocalRef(methodInfo.classID);
}

テストデバイスの設定を行う

実行してログを確認するとデバイスIDが出力されるので、その内容をコピーしてリソースに追加します。

I Ads : Use AdRequest.Builder.addTestDevice("デバイスID") to get test ads on this device.

ラベル:android cocos2d AdMob
posted by かねだ at 09:51| Comment(0) | 開発方法メモ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。