【教程分享】如何在Cocos2d-x V3.0项目中集成Admob

— Begin quote from ____

由于Cocos2d-x v3.0使用android.app.NativeActivity,替代了原先的android.app.Activity,因此就有一个问题,Admob不能很好地工作在纯native activity应用中。这篇文章将会指导你怎样去搞定这个问题。

— End quote

1.在Admob中创建app
首先,创建一个免费的Admob账户,提供如下信息来完成Abmob账户的创建。

然后,添加你的第一个app,如下:

2.使用Google Play Service SDK
因为Google Play将不再接受使用Google Mobile Ads SDK v6.4.1以及更低版本的创建新应用和更新应用,因此我们选择了https://developers.google.com/mobile-ads-sdk/download#downloadplay,这也是官方推荐在Android应用中使用广告的方式。

3.配置Google Play Services SDK
在使用https://developer.android.com/reference/gms-packages.html开发应用之前,我们需要先从https://developer.android.com/tools/help/sdk-manager.html下载Google Play services SDK。
打开
SDK Manager: 在已安装ADT的Eclipse中,选择
Window ->
Android SDK Manager
安装Google Play services SDK: 滚动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,将以下标签添加到下。

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

将以下标签添加到下。

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

由于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,加入以下代码:

#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,加入以下代码:

#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()就可以看到广告了。

5.源码下载
你可以到https://github.com/Ryeeeeee/AdmobDemoV3下载本文档的源码,然后替代相应的文件到你的项目中即可。

6.参考文档
http://www.dynadream.com/ddweb/index.php/Special_Blog?id=20
https://developers.google.com/mobile-ads-sdk/

翻译自:http://www.cocos2d-x.org/forums/6/topics/46616,作者:Ryeeeeee

不错,顶你~~~~~~~~~~~~

十分感谢,但有个问题请教一下,上面代码是针对普通的通过add View形式的广告,
但有些广告比较特殊,比如百度的插屏广告,是通过showAd(activity)的形式
我如果将Cocos2dxActivity作为参数传进去,发现是无法显示广告的,这个有办法解决吗?

这就是那坑爹的接口:

注册应用的时候已经不是这样了。。。让输入税号什么的。。

税号可以不填。。。 :14:

好东西,果断顶

谢谢支持。。。 :904:

百度广告的插屏广告问题不能帮忙一起看下嘛:12:

晚点行么。。。这种事情植入的太蛋疼了。。。给我点时间。。。至少度娘API要看啊。。。

:6: :6: 麻麻呀! 这教程对于所有的cocos2d-x版本语言都试用么? js 和 lua !!

又是个好教程,顶一个:2::14:

写的真是详细啊。。好帖。。

3.0正式版里面没用nativeactivity了吧。。。

:2: :2: :2: :2: :2:

版主,这个方法在正式版里面不适用了,还是撤掉精华吧,不然很误人的,

http://www.cocos2d-x.org/forums/6/topics/50259
这个帖子才适合正式版

:2::2:收藏收藏

同意同意:2::2:

admob的banner广告搞定了。
可是admob插页代码试了很久搞不定,一直提示adv没有load,可是我明明已经adView.loadAd(adRequest);
不知道各位有碰到这种问题吗?

赞一个,查了好久看来你的翻译,终于搞好了:14: