最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
cocos2dx 3.x admob
本文将详细介绍在Cocos2d-x 3.x项目中集成Admob广告的具体流程。
1. 在Admob中创建应用
首先,你需要创建一个免费的Admob账户。在创建过程中,按照系统提示提供必要的信息,完成Admob账户的注册。
账户创建完成后,添加你的第一个应用。具体操作可参考Admob平台的相关指引。
2. 使用Google Play Service SDK
由于Google Play不再接受使用Google Mobile Ads SDK v6.4.1及更低版本创建新应用或更新应用,因此我们选择“Android(Google Play Services)”,这也是官方推荐在Android应用中使用广告的方式。
3. 配置Google Play Services SDK
在使用Google Play services APIs开发应用之前,需要先从SDK Manager下载Google Play services SDK,具体步骤如下:
打开SDK Manager
如果你已经安装了ADT的Eclipse,可选择“Window” -> “Android SDK Manager”来打开它。
安装Google Play services SDK
在SDK Manager的Package list中,滚动至底部,展开“Extras”选项,选择“Google Play services”,然后确认安装。安装完成后,它会将Android SDK环境保存到$ANDROID_SDK/extras/google/google_play_services/目录下。
拷贝Google Play services库工程
将$ANDROID_SDK/extras/google/google_play_services/libproject/google-play-services_lib/库项目拷贝到你需要维护的安卓项目中。
4. 集成SDK
添加并引用Google Play services库工程
在Eclipse中,右键点击项目,选择“Properties”。在弹出的窗口中,选择“Android”,然后点击“Add...”按钮,找到google-play-services_lib工程,点击“OK”完成Google Play services库的添加。此时,项目就已经成功引用了Google Play services库。
配置AndroidManifest.xml
打开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"/>
在<manifest>标签下添加以下内容
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
解决Admob在纯native activity应用中的兼容性问题
由于Cocos2d-x v3.0使用android.app.NativeActivity替代了原先的android.app.Activity,Admob在纯native activity应用中可能无法正常工作。下面是具体的解决方案:
打开Cocos2dxActivity.java文件,按如下方式修改:
package org.cocos2dx.cpp;
import android.app.NativeActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
public class Cocos2dxActivity extends NativeActivity {
private AdView adView;
private PopupWindow popUp;
private static Cocos2dxActivity _activity;
private LinearLayout layout;
private LinearLayout mainLayout;
boolean adsinited = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Make your custom init here
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
_activity = this;
// Create our ad view here
adView = new AdView(this); // you can get the ID from Admob
adView.setAdUnitId("a1531054c66348c");
adView.setAdSize(AdSize.BANNER);
}
public static void showAdPopup(){
_activity._showAdPopup();
}
public void _showAdPopup() {
if (adsinited) {
return;
}
if (adView != null) {
_activity.runOnUiThread(new Runnable() {
@Override
public void run() {
adsinited = true;
// Out popup window
popUp = new PopupWindow(_activity);
// This is the minimum size for AdMob, we need to set this in case our target device run at 320x480 resolution(Otherwise no ad will be shown, see the padding kill below)
popUp.setWidth(320);
popUp.setHeight(50);
popUp.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
popUp.setClippingEnabled(false);
layout = new LinearLayout(_activity);
mainLayout = new LinearLayout(_activity);
// The layout system for the PopupWindow will kill some pixels due to margins/paddings etc… (No way to remove it), so padd it to adjust
layout.setPadding(-5, -5, -5, -5);
MarginLayoutParams params = new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 0, 0);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(adView, params);
popUp.setContentView(layout);
_activity.setContentView(mainLayout, params);// you can get the TestDevice ID from the output of logcat .
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("CE7DCE5945F79BBF863872D5026787EFbuild")
.build();
// Enable this if your are testing AdMob, otherwise you'll risk to be banned!
_activity.adView.loadAd(adRequest);
// Show our popup window
popUp.showAtLocation(mainLayout, Gravity.BOTTOM, 0, 0);
popUp.update();
}
});
}
}
private class AdmobListener extends AdListener {
@Override
public void onAdClosed() {
super.onAdClosed();
}
@Override
public void onAdFailedToLoad(int errorCode) {
super.onAdFailedToLoad(errorCode);
}
@Override
public void onAdLeftApplication() {
super.onAdLeftApplication();
}
@Override
public void onAdLoaded() {
super.onAdLoaded();
}
@Override
public void onAdOpened() {
super.onAdOpened();
}
}
@Override
public void onDestroy() {
if (adView != null) {
adView.destroy();
}
super.onDestroy();
}
}
重要提示
要注意的是,不要在onCreate回调中调用显示广告的函数,必须在整个窗口创建完毕后才能调用。具体来说,就是当游戏窗口准备显示时调用。
创建AdmobHelper.h文件
在项目中创建AdmobHelper.h文件,并加入以下代码:
#ifndef __Admob_Helper_H_
#define __Admob_Helper_H_
class AdmobHelper
{
public:
static void showAds();
//if necessary, you can add other methods to control AdView(e.g. dismiss the AdView).
};
#endif //__INTERFACE_FACEBOOK_H_
创建AdmobHelper.cpp文件
创建AdmobHelper.cpp文件,并加入以下代码:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "AdmobHelper.h"
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#include <android/log.h>
const char* NativeActivityClassName = "org/cocos2dx/cpp/Cocos2dxActivity";
void AdmobHelper::showAds(){
cocos2d::JniMethodInfo t;
if (cocos2d::JniHelper::getStaticMethodInfo(t, NativeActivityClassName, "showAdPopup", "()V"))
{
t.env->CallStaticVoidMethod(t.classID, t.methodID);
t.env->DeleteLocalRef(t.classID);
}
}
#endif
显示广告
最后,在C++端通过包含"AdmobHelper.h",然后调用AdmobHelper::showAds()就可以看到广告了。