1. 程式人生 > >谷歌廣告Admob在cocos2dx上通過回調實現底部Banner

谷歌廣告Admob在cocos2dx上通過回調實現底部Banner

rac dea oncreate match orien googl sid onresume clu

首先說明我的開發平臺,以免由於平臺問題造成不必要的誤解:

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比較慢。

谷歌廣告Admob在cocos2dx上通過回調實現底部Banner