がおまる開発ブログ

cocos2d-xやlevelhelperを使って iPhone/Androidアプリの作り方を解説します

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

cocos2d-xにAdmobメディエーションのカスタムイベントを導入する(Android編)

cocos2d-xにAdmobメディエーションのカスタムイベントを導入していきます。
Googleの解説が糞すぎてワケワカウッヒャーなので、

図解入りでわかりやすく導入していきます。

※このやり方でおかしくなっても責任は取れませんので悪しからずm(_ _)m

メディエーションの設定を行う

Admobの管理サイトにログインしてください。

広告ネットワーク メディエーションを選択
2013052501.png

名前は好きなもので結構です。
プラットフォームは今回はAndroidの導入手順なので、「Android」を選択
広告サイズはバナーを出したいので、「バナー 320x50」を選択
自動更新したい場合は、更新間隔を設定しましょう。

2013052502.png

メディエーションIDは後で使いますので、メモっておきます。
カスタムイベントを追加していきましょう。
2013052503.png

Labelはわかりやすい名前を付けましょう
Class Nameにパッケージ名とクラス名を入力しましょう。今回は「jp.gaomar.mediation.AdCustomNend」としました。
Parameterを渡したい場合は入力してください。
2013052504.png

2013052505.png


Eclipseでの手順

ここからは、Eclipseにて設定していきます。
先ずは各社の広告SDKをプロジェクトのlibsフォルダにコピーしていきましょう。

2013052506.png

続いて、メディエーションのSDKをコピーします。
2013052507.png


Eclipseを起動して、プログラムを書いて行きましょう。
AndroidManifest.xmlを開いてください。

2013052509.png


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.gaomar.mediation"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk android:minSdkVersion="8"/>
<uses-feature android:glEsVersion="0x00020000" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application android:label="@string/app_name"
android:icon="@drawable/icon">

<activity android:name=".GaomarTest"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

<meta-data android:name="Adlantis_Publisher_ID" android:value="xxxxxxxxxxxx" />

</application>
<supports-screens android:largeScreens="true"
android:smallScreens="true"
android:anyDensity="true"
android:normalScreens="true"/>
</manifest>



新規クラスを追加してください。
CustomAd.javaを作成します。
2013052511.png


package jp.gaomar.mediation;

import android.app.Activity;

import com.google.ads.AdSize;
import com.google.ads.mediation.MediationAdRequest;
import com.google.ads.mediation.customevent.CustomEventBanner;
import com.google.ads.mediation.customevent.CustomEventBannerListener;

public abstract class CustomAd implements CustomEventBanner {


@Override
public void requestBannerAd(
final CustomEventBannerListener listener,
final Activity activity,
String label,
String serverParameter,
AdSize adSize,
MediationAdRequest request,
Object customEventExtra) {

}


@Override
public void destroy() {
}

}



続いて、先程メディエーションの管理画面で指定した
クラス名で新規作成します。「AdCustomNend.java」を作成しましょう。

2013052512.png

ad_area.xmlを新規で作成しましょう。
2013052515.png

中身はこんな感じで〜

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ad_area"
android:layout_width="320dip"
android:layout_height="50dip"
android:gravity="center_horizontal">
</LinearLayout>





package jp.gaomar.mediation;

import net.nend.android.NendAdView;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import com.google.ads.AdSize;
import com.google.ads.mediation.MediationAdRequest;
import com.google.ads.mediation.customevent.CustomEventBannerListener;

public class AdCustomNend extends CustomAd{
private static ViewGroup adParentView;
private static NendAdView adView = null;

private final int nendSpot_id = xxxxx;
private final String nendApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

@Override
public void requestBannerAd(CustomEventBannerListener listener,
Activity activity, String label, String serverParameter,
AdSize adSize, MediationAdRequest request,
Object customEventExtra) {

super.requestBannerAd(listener, activity, label, serverParameter, adSize,request,customEventExtra);
if(adView!=null){
onRecivedAd(listener);
return;
}

try {
LayoutInflater inflater = activity.getLayoutInflater();
adParentView = (ViewGroup)inflater.inflate(R.layout.ad_area, null);
adView = null;
adView = new NendAdView(activity, nendSpot_id, nendApiKey);
adView.loadAd();

adParentView.addView(adView);
} catch (Exception e) {
listener.onFailedToReceiveAd();
return;
}
onRecivedAd(listener);
}

private void onRecivedAd(CustomEventBannerListener listener) {
try {
listener.onReceivedAd(adParentView);
} catch (Exception e) {
listener.onFailedToReceiveAd();
}
}

}



メディエーション全体を管理するMyAds.javaを作りましょう。
これは別に好きなクラス名で結構です。
2013052510.png


package jp.gaomar.mediation;


import android.app.Activity;
import android.widget.LinearLayout;

import com.google.ads.AdRequest;
import com.google.ads.AdSize;
import com.google.ads.AdView;

public class MyAds {
private Activity mActivity;
private LinearLayout mLayout;

private final String myAdID = "メディエーションIDを入力";

public MyAds(Activity act, LinearLayout layout) {
mActivity = act;
mLayout = layout;
adInit();
}

/**
* 広告初期化
*/
private void adInit() {
// Create the adView
final AdView adView = new AdView(mActivity, AdSize.BANNER, myAdID);

// Add the adView to it
mLayout.addView(adView);

AdRequest adRequest = new AdRequest();

// Initiate a generic request to load it with an ad
adView.loadAd(adRequest);

}
}



最後にCocos2dxActivity.javaを編集します。

2013052514.png


/****************************************************************************
Copyright (c) 2010-2013 cocos2d-x.org

http://www.cocos2d-x.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package org.cocos2dx.lib;

import jp.gaomar.mediation.MyAds;

import org.cocos2dx.lib.Cocos2dxHelper.Cocos2dxHelperListener;

import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener {
// ===========================================================
// Constants
// ===========================================================

private static final String TAG = Cocos2dxActivity.class.getSimpleName();

// ===========================================================
// Fields
// ===========================================================

private Cocos2dxGLSurfaceView mGLSurfaceView;
private Cocos2dxHandler mHandler;
private static Context sContext = null;

// 広告レイアウト
private LinearLayout myAdView;

public static Context getContext() {
return sContext;
}

// ===========================================================
// Constructors
// ===========================================================

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sContext = this;
this.mHandler = new Cocos2dxHandler(this);

this.init();

Cocos2dxHelper.init(this, this);
}

// ===========================================================
// Getter & Setter
// ===========================================================

// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================

@Override
protected void onResume() {
super.onResume();

Cocos2dxHelper.onResume();
this.mGLSurfaceView.onResume();
}

@Override
protected void onPause() {
super.onPause();

Cocos2dxHelper.onPause();
this.mGLSurfaceView.onPause();
}

@Override
public void showDialog(final String pTitle, final String pMessage) {
Message msg = new Message();
msg.what = Cocos2dxHandler.HANDLER_SHOW_DIALOG;
msg.obj = new Cocos2dxHandler.DialogMessage(pTitle, pMessage);
this.mHandler.sendMessage(msg);
}

@Override
public void showEditTextDialog(final String pTitle, final String pContent, final int pInputMode, final int pInputFlag, final int pReturnType, final int pMaxLength) {
Message msg = new Message();
msg.what = Cocos2dxHandler.HANDLER_SHOW_EDITBOX_DIALOG;
msg.obj = new Cocos2dxHandler.EditBoxMessage(pTitle, pContent, pInputMode, pInputFlag, pReturnType, pMaxLength);
this.mHandler.sendMessage(msg);
}

@Override
public void runOnGLThread(final Runnable pRunnable) {
this.mGLSurfaceView.queueEvent(pRunnable);
}

// ===========================================================
// Methods
// ===========================================================
public void init() {

// FrameLayout
ViewGroup.LayoutParams framelayout_params =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
FrameLayout framelayout = new FrameLayout(this);
framelayout.setLayoutParams(framelayout_params);

// Cocos2dxEditText layout
ViewGroup.LayoutParams edittext_layout_params =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
Cocos2dxEditText edittext = new Cocos2dxEditText(this);
edittext.setLayoutParams(edittext_layout_params);

// ...add to FrameLayout
framelayout.addView(edittext);

// Cocos2dxGLSurfaceView
this.mGLSurfaceView = this.onCreateView();

// ...add to FrameLayout
framelayout.addView(this.mGLSurfaceView);

// Switch to supported OpenGL (ARGB888) mode on emulator
if (isAndroidEmulator())
this.mGLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0);

this.mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
this.mGLSurfaceView.setCocos2dxEditText(edittext);

// 広告ビュー設定
RelativeLayout adMain = new RelativeLayout(this);

// メディエーション設定
myAdView = new LinearLayout(this);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
(int)(50 * getResources().getDisplayMetrics().density));
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
myAdView.setGravity(Gravity.CENTER_HORIZONTAL);
myAdView.setLayoutParams(layoutParams);

this.runOnUiThread(new Runnable() {
@Override
public void run() {
new MyAds(Cocos2dxActivity.this, myAdView);

}
});

adMain.addView(myAdView);

framelayout.addView(adMain);

// Set framelayout as the content view
setContentView(framelayout);
}


public Cocos2dxGLSurfaceView onCreateView() {
return new Cocos2dxGLSurfaceView(this);
}

private final static boolean isAndroidEmulator() {
String model = Build.MODEL;
Log.d(TAG, "model=" + model);
String product = Build.PRODUCT;
Log.d(TAG, "product=" + product);
boolean isEmulator = false;
if (product != null) {
isEmulator = product.equals("sdk") || product.contains("_sdk") || product.contains("sdk_");
}
Log.d(TAG, "isEmulator=" + isEmulator);
return isEmulator;
}

// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}



うまいこといけば、下に出るはず!
上に出したい場合は、167行目をコメントアウトすればオッケー!
2013052516.png

スポンサーサイト

cocos2d-xにAdWhirlを導入する (Android編)

途中のadwhirl管理サイトにアプリを登録して、カスタムイベント登録する部分までは、
前回のiOS編を参考にしてください。

こちらからAndroid用のSDKをダウンロードしてください。

AdWhirlを組み込む

ダウンロードしてきたjarファイルをproj.android→libsフォルダへコピーしましょう。
2013050101.png

他社SDKをダウンロード

今回はnendSDK-2.0.0とi-mobileSDK_1.4.0での説明です。
同じようにダウンロードしてきたjarファイルをlibsフォルダへコピーしましょう

2013050102.png

2013050103.png

ビルドパスを通してください。
2013050104.png

これで準備はOKです。

マニフェストファイルの編集

2013050106.png


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.marnishi.Principal"
android:installLocation="preferExternal"
android:versionCode="3"
android:versionName="1.1.0">

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

<application android:label="@string/app_name"
android:debuggable="false"
android:icon="@drawable/icon">

<activity android:name=".Principal"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name="com.google.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

<meta-data android:name="i-mobile_Publisher_ID" android:value="i-mobileのID" />
</application>
<supports-screens android:largeScreens="true"
android:smallScreens="true"
android:anyDensity="true"
android:normalScreens="true"/>
</manifest>

ネットワークのパーミッションとi-mobile用のIDの設定とadwhirl用の設定を記述します

ソースを編集する

新規classを作成してください。
僕の場合はAds.javaというのを作成しました。
2013050105.png


package com.marnishi.Principal;


import jp.co.imobile.android.AdRequestResult;
import jp.co.imobile.android.AdView;
import jp.co.imobile.android.AdViewRequestListener;
import net.nend.android.NendAdView;
import android.app.Activity;
import android.widget.LinearLayout;

import com.adwhirl.AdWhirlLayout;
import com.adwhirl.AdWhirlLayout.AdWhirlInterface;

public class Ads implements AdWhirlInterface{
private Activity mActivity;
private LinearLayout mLayout;

private AdWhirlLayout adWhirlLayout;
private jp.co.imobile.android.AdView imobileAd;
private NendAdView nendAd;

// nend用
private final int nendSpot_id = xxxxxx;
private final String nendApiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
// i-mobile用
private final int iMobileMediaID = xxxxx;
private final int iMobileSpotID = xxxxx;
// adwhirl用
private final String adWhirlID = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

public Ads(Activity act, LinearLayout layout) {
mActivity = act;
mLayout = layout;
adInit();
}

/**
* 広告初期化
*/
private void adInit() {
// i-mobile初期化
imobileAd = AdView.createForAdWhirl(mActivity, iMobileMediaID, iMobileSpotID);
// adwhirl初期化(AdWhirl管理画面のSDK Key:を入力する)
adWhirlLayout = new AdWhirlLayout(mActivity, adWhirlID);
adWhirlLayout.setAdWhirlInterface(this);
mLayout.addView(adWhirlLayout);

}

/**
* カスタムイベントのnend処理
*/
public void nend() {
nendAd = null;
nendAd = new NendAdView(mActivity, nendSpot_id, nendApiKey);
nendAd.loadAd();

adWhirlLayout.adWhirlManager.resetRollover();
adWhirlLayout.removeAllViews();
adWhirlLayout.addView(nendAd);
adWhirlLayout.rotateThreadedDelayed();
}

/**
* カスタムイベントimobile処理
*/
public void imobile() {
imobileAd.setOnRequestListener(new AdViewRequestListener() {
@Override
public void onCompleted(AdRequestResult result, AdView sender) {
adWhirlLayout.adWhirlManager.resetRollover();
adWhirlLayout.removeAllViews();
adWhirlLayout.addView(sender);
adWhirlLayout.rotateThreadedDelayed();
}
@Override
public void onFailed(AdRequestResult result, AdView sender) {
adWhirlLayout.rollover();
}
});
// 広告取得開始
imobileAd.start();
}

@Override
public void adWhirlGeneric() {
// TODO 自動生成されたメソッド・スタブ

}


}


続いてCocos2dxActivity.javaを編集します。
2013050107.png


public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener {
private Cocos2dxGLSurfaceView mGLSurefaceView;
private Cocos2dxHandler mHandler;
private static Cocos2dxActivity myref;

// 幅、または高さいっぱいに広げる
private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
// ジャストのサイズにする
private final int FP = LinearLayout.LayoutParams.FILL_PARENT;
// 広告レイアウト
private LinearLayout adView;

@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

this.init();

Cocos2dxHelper.init(this, this);

}
/**
* 初期処理
*/
public void init() {
// Init handler
this.mHandler = new Cocos2dxHandler(this);

// FrameLayout
ViewGroup.LayoutParams framelayout_params =
new ViewGroup.LayoutParams(FP,FP);
FrameLayout framelayout = new FrameLayout(this);
framelayout.setLayoutParams(framelayout_params);

// Cocos2dxEditText layout
ViewGroup.LayoutParams edittext_layout_params =
new ViewGroup.LayoutParams(FP,WC);
Cocos2dxEditText edittext = new Cocos2dxEditText(this);
edittext.setLayoutParams(edittext_layout_params);

// ...add to FrameLayout
framelayout.addView(edittext);

// Cocos2dxGLSurfaceView
this.mGLSurefaceView = this.onCreateGLSurfaceView();

// ...add to FrameLayout
framelayout.addView(mGLSurefaceView);

mGLSurefaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
mGLSurefaceView.setCocos2dxEditText(edittext);

RelativeLayout adMain = new RelativeLayout(this);

// 広告表示するViewの初期化
adView = new LinearLayout(this);
RelativeLayout.LayoutParams layoutParams =
new RelativeLayout.LayoutParams(FP, (int)(50 * getResources().getDisplayMetrics().density));
// 下に表示する場合は有効にしてください
// layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

// 中央に表示
adView.setGravity(Gravity.CENTER_HORIZONTAL);
adView.setLayoutParams(layoutParams);

this.runOnUiThread(new Runnable() {
@Override
public void run() {
// adwhirl初期化
new Ads(Cocos2dxActivity.this, adView);
}
});

adMain.addView(adView);
framelayout.addView(adMain);

// Set framelayout as the content view
setContentView(framelayout);
}
}



これで起動すれば、広告が表示されると思います。



FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。