注册 登录
主题 : 【教程分享】如何在Cocos2d-x V3.0项目中集成Admob
级别: 版主

状态: 连续签到 - [27天]
UID: 300874
精华: 13
发帖: 2378
可可豆: 3131 CB
威望: 3189 点
在线时间: 1378(时)
注册时间: 2014-03-18
最后登录: 2016-05-06
0 楼:  发表于: 2014-03-20 15:11    发自: Web Page

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

管理提醒: 本帖被 偶尔e网事 执行提前操作(2014-03-25)
引用
由于Cocos2d-x v3.0使用android.app.NativeActivity,替代了原先的android.app.Activity,因此就有一个问题,Admob不能很好地工作在纯native activity应用中。这篇文章将会指导你怎样去搞定这个问题。

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


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


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: 滚动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,将以下标签添加到<application>下。
复制代码
  1. <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> 
  2. <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

将以下标签添加到<manifest>下。
复制代码
  1. <uses-permission android:name="android.permission.INTERNET"/> 
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

由于Cocos2d-x v3.0使用android.app.NativeActivity,替代了原先的android.app.Activity,因此就有一个问题,Admob不能很好地工作在纯native activity应用中。以下为解决方案。
好了,打开Cocos2dxActivity.java,按如下方式修改:
复制代码
  1. package org.cocos2dx.cpp;
  2. import android.app.NativeActivity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.Gravity;
  6. import android.view.ViewGroup.LayoutParams;
  7. import android.view.ViewGroup.MarginLayoutParams;
  8. import android.view.WindowManager;
  9. import android.widget.LinearLayout;
  10. import android.widget.PopupWindow;
  11. import com.google.android.gms.ads.AdListener;
  12. import com.google.android.gms.ads.AdRequest;
  13. import com.google.android.gms.ads.AdSize;
  14. import com.google.android.gms.ads.AdView;
  15. public class Cocos2dxActivity extends NativeActivity {
  16. private AdView adView;
  17. private PopupWindow popUp;
  18. private static Cocos2dxActivity _activity;
  19. private LinearLayout layout;
  20. private LinearLayout mainLayout;
  21. boolean adsinited = false;
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. // Make your custom init here
  26. getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  27. _activity = this;
  28. // Create our ad view here
  29. adView = new AdView(this); // you can get the ID from Admob
  30. adView.setAdUnitId("a1531054c66348c");
  31. adView.setAdSize(AdSize.BANNER);
  32. }
  33. public static void showAdPopup(){
  34. _activity._showAdPopup();
  35. }
  36. public void _showAdPopup() {
  37. if (adsinited) {
  38. return;
  39. }
  40. if (adView != null) {
  41. _activity.runOnUiThread(new Runnable() {
  42. @Override
  43. public void run() {
  44. adsinited = true;
  45. // Out popup window
  46. popUp = new PopupWindow(_activity);
  47. // 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)
  48. popUp.setWidth(320);
  49. popUp.setHeight(50);
  50. popUp.setWindowLayoutMode(LayoutParams.WRAP_CONTENT,
  51. LayoutParams.WRAP_CONTENT);
  52. popUp.setClippingEnabled(false);
  53. layout = new LinearLayout(_activity);
  54. mainLayout = new LinearLayout(_activity);
  55. // 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
  56. layout.setPadding(-5, -5, -5, -5);
  57. MarginLayoutParams params = new MarginLayoutParams(
  58. LayoutParams.WRAP_CONTENT,
  59. LayoutParams.WRAP_CONTENT);
  60. params.setMargins(0, 0, 0, 0);
  61. layout.setOrientation(LinearLayout.VERTICAL);
  62. layout.addView(adView, params);
  63. popUp.setContentView(layout);
  64. _activity.setContentView(mainLayout, params);// you can get the TestDevice ID from the output of logcat .
  65. AdRequest adRequest = new AdRequest.Builder()
  66. .addTestDevice(
  67. "CE7DCE5945F79BBF863872D5026787EFbuild")
  68. .build();
  69. // Enable this if your are testing AdMob, otherwise you'll risk to be banned!
  70. _activity.adView.loadAd(adRequest);
  71. // Show our popup window
  72. popUp.showAtLocation(mainLayout, Gravity.BOTTOM, 0, 0);
  73. popUp.update();
  74. }
  75. });
  76. }
  77. }
  78. private class AdmobListener extends AdListener {
  79. @Override
  80. public void onAdClosed() {
  81. super.onAdClosed();
  82. }
  83. @Override
  84. public void onAdFailedToLoad(int errorCode) {
  85. super.onAdFailedToLoad(errorCode);
  86. }
  87. @Override
  88. public void onAdLeftApplication() {
  89. super.onAdLeftApplication();
  90. }
  91. @Override
  92. public void onAdLoaded() {
  93. super.onAdLoaded();
  94. }
  95. @Override
  96. public void onAdOpened() {
  97. super.onAdOpened();
  98. }
  99. }
  100. @Override
  101. public void onDestroy() {
  102. if (adView != null) {
  103. adView.destroy();
  104. }
  105. super.onDestroy();
  106. }
  107. }

重要提示: 
要谨记的是不要在onCreate回调中调用这个函数,必须要在整个窗口已经创建完毕后才能调用这段代码,就这里而言,就是当游戏窗口已经准备要显示的时候调用。
创建AdmobHelper.h,加入以下代码:
复制代码
  1. #ifndef  __Admob_Helper_H_
  2. #define  __Admob_Helper_H_
  3. class AdmobHelper
  4. {
  5. public:
  6.     static void showAds();
  7. //if necessary, you can add other methods to control AdView(e.g. dismiss the AdView).
  8. };
  9. #endif  //__INTERFACE_FACEBOOK_H_

创建AdmobHelper.cpp,加入以下代码:
复制代码
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
  2. #include "AdmobHelper.h"
  3. #include "platform/android/jni/JniHelper.h"
  4. #include <jni.h>
  5. #include <android/log.h>
  6. const char* NativeActivityClassName = "org/cocos2dx/cpp/Cocos2dxActivity";
  7. void AdmobHelper::showAds(){
  8. cocos2d::JniMethodInfo t;
  9. if (cocos2d::JniHelper::getStaticMethodInfo(t
  10.                                                 , NativeActivityClassName
  11.                                                 , "showAdPopup"
  12.                                                 , "()V"))
  13. {
  14.   t.env->CallStaticVoidMethod(t.classID, t.methodID);
  15.   t.env->DeleteLocalRef(t.classID);
  16. }
  17. }
  18. #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


[ 此帖被偶尔e网事在2014-03-20 15:40重新编辑 ]

清空我的评分动态本帖最近评分记录: 共1条评分记录
zzzzzzzzz04 可可豆 +1 2014-03-20 优秀文章
隐藏评分记录
级别: 侠客
UID: 183476
精华: 4
发帖: 69
可可豆: 308 CB
威望: 221 点
在线时间: 26(时)
注册时间: 2012-12-04
最后登录: 2015-03-16
1 楼:  发表于: 2014-03-20 17:04    发自: Web Page
不错,顶你~~~~~~~~~~~~
生活是如此的美好,及时那无法预知的未来
级别: 新手上路
UID: 133676
精华: 0
发帖: 39
可可豆: 31 CB
威望: 192 点
在线时间: 38(时)
注册时间: 2012-03-31
最后登录: 2018-07-22
2 楼:  发表于: 2014-03-20 23:31    发自: Web Page
回 楼主(偶尔e网事) 的帖子
十分感谢,但有个问题请教一下,上面代码是针对普通的通过add View形式的广告,
但有些广告比较特殊,比如百度的插屏广告,是通过showAd(activity)的形式
我如果将Cocos2dxActivity作为参数传进去,发现是无法显示广告的,这个有办法解决吗?
级别: 新手上路
UID: 133676
精华: 0
发帖: 39
可可豆: 31 CB
威望: 192 点
在线时间: 38(时)
注册时间: 2012-03-31
最后登录: 2018-07-22
3 楼:  发表于: 2014-03-20 23:45    发自: Web Page
这就是那坑爹的接口:

图片:QQ截图20140320234349.png
级别: 新手上路
UID: 263420
精华: 0
发帖: 41
可可豆: 176 CB
威望: 177 点
在线时间: 78(时)
注册时间: 2013-09-28
最后登录: 2015-04-24
4 楼:  发表于: 2014-03-21 00:41    发自: Web Page
回 楼主(偶尔e网事) 的帖子
注册应用的时候已经不是这样了。。。让输入税号什么的。。
图片:火狐截图_2014-03-20T16-35-19.733Z.png
级别: 版主

状态: 连续签到 - [27天]
UID: 300874
精华: 13
发帖: 2378
可可豆: 3131 CB
威望: 3189 点
在线时间: 1378(时)
注册时间: 2014-03-18
最后登录: 2016-05-06
5 楼:  发表于: 2014-03-21 13:54    发自: Web Page
回 4楼(liupengbo) 的帖子
税号可以不填。。。
级别: 新手上路
状态: 连续签到 - [3天]
UID: 300245
精华: 0
发帖: 21
可可豆: 103 CB
威望: 83 点
在线时间: 34(时)
注册时间: 2014-03-15
最后登录: 2015-06-05
6 楼:  发表于: 2014-03-21 15:22    发自: Web Page
好东西,果断顶
级别: 版主

状态: 连续签到 - [27天]
UID: 300874
精华: 13
发帖: 2378
可可豆: 3131 CB
威望: 3189 点
在线时间: 1378(时)
注册时间: 2014-03-18
最后登录: 2016-05-06
7 楼:  发表于: 2014-03-21 16:03    发自: Web Page
回 6楼(yangxuan0261) 的帖子
谢谢支持。。。
级别: 新手上路
UID: 133676
精华: 0
发帖: 39
可可豆: 31 CB
威望: 192 点
在线时间: 38(时)
注册时间: 2012-03-31
最后登录: 2018-07-22
8 楼:  发表于: 2014-03-21 20:16    发自: Web Page
回 7楼(偶尔e网事) 的帖子
百度广告的插屏广告问题不能帮忙一起看下嘛
级别: 版主

状态: 连续签到 - [27天]
UID: 300874
精华: 13
发帖: 2378
可可豆: 3131 CB
威望: 3189 点
在线时间: 1378(时)
注册时间: 2014-03-18
最后登录: 2016-05-06
9 楼:  发表于: 2014-03-21 21:24    发自: Web Page
回 8楼(yxriyin) 的帖子
晚点行么。。。这种事情植入的太蛋疼了。。。给我点时间。。。至少度娘API要看啊。。。

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部