谷歌广告Admob在cocos2dx上通过回调实现底部Banner

首先说明我的开发平台,以免由于平台问题造成不必要的误解:

cocos2dx-3.4

ndk-r9d

eclipse

Admob是谷歌官方广告,已经集成在google_play_service_lib包里面,这里给出百度云下载地址,大家也可以使用官方提供的包。

下载包之后导入到eclipse,将刚导入的项目添加到自己的项目(本文中的项目是AdmobDemo)中做依赖,如下图

然后添加以下代码到AdmobDemo的Manifest.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.xml的<manifest>标签下:

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

然后打开下项目的java代码的主Activity(这里是是AppActivity),新建项目是一个新建的空的java类,实现代码如下:

/****************************************************************************
Copyright (c) 2008-2010 Ricardo Quesada
Copyright (c) 2010-2012 cocos2d-x.org
Copyright (c) 2011      Zynga Inc.
Copyright (c) 2013-2014 Chukong Technologies Inc.

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.cpp;

import java.util.Timer;
import java.util.TimerTask;

import org.cocos2dx.lib.Cocos2dxActivity;

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

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class AppActivity extends Cocos2dxActivity {

    private AdView adView;
    private static final String AD_UNIT_ID = "ca-app-pub-2641376718074288/4798565659";//此处需要申请账号,然后生成应用id
    private static AppActivity _appActiviy;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//横屏:根据传感器横向切换

        RelativeLayout layout = new RelativeLayout(this);
        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        addContentView(layout,lp);
        RelativeLayout.LayoutParams adParams = new RelativeLayout.LayoutParams(
        LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
        adParams.setMargins(5, 5, 5, 5);
        adView = new AdView(this);
        adView.setAdSize(AdSize.BANNER);
        adView.setAdUnitId(AD_UNIT_ID );
        adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        AdRequest adRequest = new AdRequest.Builder().addTestDevice(AdRequest.DEVICE_ID_EMULATOR).build();

        adView.loadAd(adRequest);
        adView.setBackgroundColor(Color.BLACK);
        adView.setBackgroundColor(0);
        layout.addView(adView,adParams);
         _appActiviy = this;
    }

    public static void hideAd(){
        _appActiviy.runOnUiThread(new Runnable(){
              @Override
              public void run(){
                    if (_appActiviy.adView.isEnabled())
                        _appActiviy.adView.setEnabled(false);
                    if (_appActiviy.adView.getVisibility() != 4 )
                        _appActiviy.adView.setVisibility(View.INVISIBLE);
              }
        });
   }

    public static void showAd(){

        _appActiviy.runOnUiThread(new Runnable(){

                @Override
                public void run(){
                    if (!_appActiviy.adView.isEnabled())
                        _appActiviy.adView.setEnabled(true);
                    if (_appActiviy.adView.getVisibility() == 4 )
                        _appActiviy.adView.setVisibility(View.VISIBLE);
                }
        });
   }

    @Override
  protected void onStart() {
      super.onStart();
  }

@Override
protected void onStop() {
    super.onStop();
}

@Override
protected void onPause() {
    super.onPause();
    if (adView != null) {
        adView.pause();
        }

}

@Override
protected void onResume() {
    super.onResume();
    if (adView != null) {
        adView.resume();
        }

}

@Override
protected void onDestroy() {
    super.onDestroy();
    adView.destroy();
}

@Override
protected void onActivityResult(int reqCode, int resCode, Intent data) {
    super.onActivityResult(reqCode, resCode, data);
}}

到这里广告窗口就已经准备好了,就是等cocos2dx 游戏主程启动时调用就OK了。

在cocos2dx里面调用Java需要使用Jni回调。

下面给出AdmobHelper.cpp类的实现:

#include "AdmobHelper.h"
#include "cocos2d.h"

bool AdmobHelper::isAdShowing = true;

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include "platform/android/jni/JniHelper.h"
#include <jni.h>
//#include <android/log.h>

const char* AppActivityClassName = "org/cocos2dx/cpp/AppActivity";

void AdmobHelper::hideAd()
{
    cocos2d::JniMethodInfo t;
    if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "hideAd", "()V"))
    {

        t.env->CallStaticVoidMethod(t.classID, t.methodID);
        t.env->DeleteLocalRef(t.classID);
        isAdShowing = false;
    }
}
void AdmobHelper::showAd()
{

    cocos2d::JniMethodInfo t;
    if (cocos2d::JniHelper::getStaticMethodInfo(t, AppActivityClassName, "showAd", "()V"))
    {

        t.env->CallStaticVoidMethod(t.classID, t.methodID);
        t.env->DeleteLocalRef(t.classID);
        isAdShowing = true;
    }

}

#else

void AdmobHelper::hideAd()
{
    CCLOG("hideAd() called");
    isAdShowing = false;
    return; //nothing
}

void AdmobHelper::showAd()
{
    CCLOG("showAd() called");
    isAdShowing = true;
    return; //nothing;

}
#endif

通过上面的AdmobHelper::showAd()就可以在C++代码中调用广告了,记得添加AdmobHelper.h到头文件中哦。

是不是很简单呢,自己实践一遍吧!

此处给出在AdmobDemo在github上的地址:https://github.com/DiaoYung/AdmobDemo;各位可以按此方法添加到自己的项目中即可。博文写的时候正在上传代码,天朝GitHub比较慢。

时间: 2024-12-18 20:26:26

谷歌广告Admob在cocos2dx上通过回调实现底部Banner的相关文章

自己动手去除app中谷歌广告

最近想去研究一下去除app中的谷歌广告,由于换了手机,且使用安卓6.0系统,暂时不能root安装辅助软件. 前言: 查看了很多网络文章,一般都是两种方法:把显示广告大小的参数改为0,或是修改广告访问的连接为无效连接,前一种比较通用且简单,后一种比较费功夫,但是更节省流量和系统资源 ,然后发现网络上的文章大多是转载的,且转载文章的人没有检测实际效果和实验环境,没有备注实验时间,这样很多转载的文章只是提供一个思路,但已经达不到效果了,所以只好重新研究一下,因为我没有系统学习java语言,只能看到什么

Ali OSS服务端签名直传并设置上传回调

服务端签名直传并设置上传回调 背景 请参考 Web端直传实践 里的背景介绍. 当采用服务端签名后直传方案后,问题来了,用户上传数据后,很多场景下,应用服务器都要知道用户上传了哪些文件,文件名字,甚至如果是图片的话,图片的大小等.为此OSS开发了上传回调功能. 用户的请求逻辑 用户向应用服务器取到上传policy和回调设置. 应用服务器返回上传policy和回调. 用户直接向OSS发送文件上传请求. 等文件数据上传完,OSS给用户Response前,OSS会根据用户的回调设置,请求用户的服务器.

接入谷歌广告错误(主要Adsense)

接入谷歌广告 1. 谷歌初始化完会有透明占位,记得隐藏防止下方游戏无法点击 2. 测试的广告域名似乎需要https和www才能播放adsense视频广告 3. 谷歌广告1009错误,广告id或者账号id不对,或者网站没通过这个广告账号验证,或者广告播放次数过多 4. 谷歌普通横幅banner广告需要正式网站才能显示 5. 广告报错900和501,据google说501是有东西遮挡在广告上(确实解决了) 原文地址:https://www.cnblogs.com/dlm17/p/12345247.h

在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现Web端直传,服务端签名直传并设置上传回调的实现流程

在OneThink(ThinkPHP3.2.3)中整合阿里云OSS的PHP-SDK2.0.4,实现本地文件上传流程 by shuijingwan · 2016/01/13 1.SDK安装 github地址:https://github.com/aliyun/aliyun-oss-php-sdk 2.复制aliyun-oss-php-sdk-master\src\OSS至passport.hmwis.com\ThinkPHP\Library\Vendor\OSS,如图1.2 复制aliyun-os

add Admob with Cocos2d-x on iOS

add Admob with Cocos2d-x on iOS (2013-02-27 14:12:00) 转载▼ 标签: c=blog&q=it&by=tag" target="_blank" style="text-decoration:none; color:rgb(62,115,160); white-space:nowrap">it   1. download admob, setup your account 2. add

js 利用iframe和location.hash跨域解决办法,java图片上传回调JS函数跨域

奶奶的:折腾了我二天,终于解决了!网上有很多例子. 但跟我的都不太一样,费话不多说了,上图   上代码: IE ,firefix,chrome 测试通过 js :这个主页面,部分代码, function submitUpload(id){ $("#imgSrc" + id +"").attr("alt", "图片上传中--"); var imgID = id; if(id>0){ imgID = 1; } var for

cocos2dx 菜单按钮回调方法传参 tag传参

.h文件 void menuCallBack(CCObject* pSender); .cpp CCMenuItemSprite* item = CCMenuItemSprite::create( menuCB1, menuCB2, this, menu_selector(helloworld::menuCallBack)); item->setTag(m); 回调方法 void helloworld::menuCallBack(CCObject* pSender) { CCNode* node

[cocos2dx] lua注册回调到c++

思路 像所有语言一样,绑定回调主要是执行的任务执行到特定情形的时候,调用对用回调方法. 这里也一样.核心思路是,当c代码执行到特定特定情形的时候,调用lua的方法 主要步骤如下 缓存lua函数在lua环境中的引用 在c代码的地方用c的方式设置好回调 在c代码回调函数执行的时候,调用lua函数 实现 c代码绑定回调,调用lua函数 void ArmatureNode::registerMovementEventHandler(int handler) { unregisterMovementEve

cocos2dx动作结束回调函数的用法

cocos2dx中一个action结束后想正确使用回调函数 要用如下写法 CCFiniteTimeAction *actionOne = CCSequence::create( CCScaleTo::create(1.0f,0.5f,1.5f), CCFadeIn::create(1.0f), CCCallFunc::create(this,callfunc_selector(xx::menuSetVisableFalse)), NULL );