がおまる開発ブログ

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

スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://gaomar.blog.fc2.com/tb.php/78-15cf2242
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

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