cocos2d-x在android下添加插屏广告

http://blog.csdn.net/wiyun_beijing/article/details/17912471

好吧,经过仔细研究,我发现其实在cocos2d-x的应用下添加的插屏广告,当用Jin调用代码时是在子线程中对UI进行操作,所以显然是不可能控制得了广告UI的,所以上一篇说的“无法添加”就当是屁话好了……反正我确实是只菜鸟……接下来把添加过程写出来,好让后继的菜鸟们能不费力的添加这类广告,甚至以自定义的方式来展示广告……

上面说过了用JIN调用插屏时是在子线程中操作UI,主线程UI不是安全线程,所以需要使用Handle来与主线程进行通信,让其在适时的时候按我们设定的方式去调用广告UI,下面是代码:

  1. public class GameActivity extends Cocos2dxActivity {
  2. private static InterstitialAd interstitialAd;
  3. public static final StringPUBLISHER_ID="56OJzCCIuNT9GZxMAZ";
  4. public static final StringInlinePPID="16TLmbLoAp3B1NUGss77M4ai";
  5. public static final StringInterstitialPPID="16TLmbLoAp3B1NUGs4bP4d9i";
  6. static DomobInterstitialAd mInterstitialAd;
  7. private static Handler mHandler;
  8. protected void onCreate(Bundle savedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. mHandler=newHandler();
  11. mInterstitialAd=newDomobInterstitialAd(this,PUBLISHER_ID,
  12. InterstitialPPID,DomobInterstitialAd.INTERSITIAL_SIZE_300X250);
  13. mInterstitialAd.setInterstitialAdListener(new DomobInterstitialAdListener() {
  14. @Override
  15. public void onInterstitialAdReady() {
  16. Log.i("DomobSDKDemo","onAdReady");
  17. }
  18. @Override
  19. public void onLandingPageOpen() {
  20. }
  21. public void onLandingPageClose() {
  22. public void onInterstitialAdPresent() {
  23. public void onInterstitialAdDismiss() {
  24. // Request new ad when the previous interstitial ad was closed.
  25. mInterstitialAd.loadInterstitialAd();
  26. public void onInterstitialAdLeaveApplication() {
  27. public void onInterstitialAdClicked(DomobInterstitialAd arg0) {
  28. public void onInterstitialAdFailed(
  29. cn.domob.android.ads.DomobAdManager.ErrorCode arg0) {
  30. // TODO Auto-generated method stub
  31. });
  32. mInterstitialAd.loadInterstitialAd();
  33. }
    publicclassGameActivityextendsCocos2dxActivity{
  1. privatestaticInterstitialAdinterstitialAd;
  2. publicstaticfinalStringPUBLISHER_ID="56OJzCCIuNT9GZxMAZ";
  3. publicstaticfinalStringInlinePPID="16TLmbLoAp3B1NUGss77M4ai";
  4. publicstaticfinalStringInterstitialPPID="16TLmbLoAp3B1NUGs4bP4d9i";
  5. staticDomobInterstitialAdmInterstitialAd;
  6. privatestaticHandlermHandler;
  7. protectedvoidonCreate(BundlesavedInstanceState){
  8. super.onCreate(savedInstanceState);
  9. InterstitialPPID,255); background-color:inherit">mInterstitialAd.setInterstitialAdListener(newDomobInterstitialAdListener(){
  10. @Override
  11. publicvoidonInterstitialAdReady(){
  12. Log.i("DomobSDKDemo",255); background-color:inherit">}
  13. @Override
  14. publicvoidonLandingPageOpen(){
  15. }
  16. publicvoidonLandingPageClose(){
  17. publicvoidonInterstitialAdPresent(){
  18. publicvoidonInterstitialAdDismiss(){
  19. //Requestnewadwhenthepreviousinterstitialadwasclosed.
  20. mInterstitialAd.loadInterstitialAd();
  21. publicvoidonInterstitialAdLeaveApplication(){
  22. publicvoidonInterstitialAdClicked(DomobInterstitialAdarg0){
  23. publicvoidonInterstitialAdFailed(
  24. cn.domob.android.ads.DomobAdManager.ErrorCodearg0){
  25. //TODOAuto-generatedmethodstub
  26. });
  27. mInterstitialAd.loadInterstitialAd();
  28. }

上面都是官方示例中的代码,下面是线程代码,:

?

    private static RunnableshowMyADi=newRunnable() {
  1. public void run() {
  2. if (mInterstitialAd.isInterstitialAdReady()){
  3. mInterstitialAd.showInterstitialAd(GameActivity.getContext());
  4. } else {
  5. };
    privatestaticRunnableshowMyADi=newRunnable(){
  1. publicvoidrun(){
  2. if(mInterstitialAd.isInterstitialAdReady()){
  3. mInterstitialAd.showInterstitialAd(GameActivity.getContext());
  4. }else{
  5. };
上面通过判断插屏广告是否加载成功进行显示或者重新请求。

最后是通过JIN来执行上面的代码:

?

    public static void showMyAD(){
  1. mHandler.post(showMyADi);
    1. publicstaticvoidshowMyAD(){
    2. mHandler.post(showMyADi);
    3. 调用后广告显示正常,点击正常……调试代码一片绿、蓝色……我想如果加聚合也这样调用的话应该差不多了……

      ///////////////////////////////////////////////////

      最近完成了自己的一个小项目,理所当然地准备在应用里加些广告……不幸的是,我想要加的有着良好用户体验的插屏广告在cocos2d-x开发的android游戏下支持并不是很好,支持好的填充率估计又跟不上。多盟的插屏在android下可以强行加入,但试过是没法正常点击的。然后是艾德思奇,他的示例里没正常展示出插屏广告,但我在芒果聚合里可以看到正常显示一个广告的框架,admob不太适用于国内,有米和易传媒的插屏广告可以正常添加,但填充率大多时候很低,其它还有权限要得太高的就没试了,所以,如果打算在android下使用插屏广告的话首推的只有安沃了,他的Demo和多盟的一样运行很正常,算是我见过Demo里最好的两家了,至于哪个更适合赚钱,这个就仁者见仁,智者见智了,我只是不想让应用空着上路……

      这里还要说下,在android下如果想在聚合里使用插屏广告基本是不可能的,因为添加插屏广告时有的是在sdk里全都写好了,只需要你调用代码,有的是需要你修改显示广告的视图或者context,所以直接使用聚合是没办法完全正确处理的,ios当然例外……下面说下如何在应用里添加安沃的插屏广告:

      1.加sdk,这个估计都会,其实直接把包copy进libs目录就行

      2.在cocos2d-x的activity里添加代码:

      这里首先得添加广告监听接口:

        publicclassappActivityextendsCocos2dxActivityimplementsFullScreenAdListener{
      1. }
        然后声明需要用到的广告视图:

        ?

          privatestaticAdDisplayer displayer;
          staticAdDisplayerdisplayer;

        接着在onCreate里初始化并添加广告的类型设置,以及广告请求:

        ?

          // 请在manifest里面设置当前activity属性 android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        1. // // 全屏广告实例
        2. displayer = AdDisplayer.getInstance(appActivity.this);
        3. // 初始化全屏广告参数
        4. displayer.initParems("5201f33630c542a0b851cb9325d744e2",true,appActivity.// 设置全屏格式
        5. /*
        6. * 可选参数有:AdDisplayer.ADWO_FS_INTERCEPT 插屏全屏
        7. * AdDisplayer.ADWO_FS_ENTRY
        8. * AdDisplayer.ADWO_FS_TRANSPOSITION
        9. */
        10. // displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);
        11. displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);
        12. // 设置请求广告类型 可选。
        13. displayer.setDesireAdType(AdDisplayer.ADWO_FS_TYPE_ALL);
        14. // 开始请求全屏广告
        15. displayer.requestFullScreenAd();
          //请在manifest里面设置当前activity属性android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        1. ////全屏广告实例
        2. displayer=AdDisplayer.getInstance(appActivity.//初始化全屏广告参数
        3. displayer.initParems(//设置全屏格式
        4. *可选参数有:AdDisplayer.ADWO_FS_INTERCEPT插屏全屏
        5. *AdDisplayer.ADWO_FS_ENTRY
        6. *AdDisplayer.ADWO_FS_TRANSPOSITION
        7. */
        8. //displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);
        9. displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);
        10. //设置请求广告类型可选。
        11. displayer.setDesireAdType(AdDisplayer.ADWO_FS_TYPE_ALL);
        12. //开始请求全屏广告
        13. displayer.requestFullScreenAd();

        上面第一条注释也已经说明了,必须在要展示广告的activity里加上
        ?
          android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
          "keyboard|keyboardHidden|orientation|screenSize"

        否则是没法将广告按照全屏进行展示的,至于广告的类型就自己参考说明进行设置好了,注意在正式发布时可别在初始化时的第二个参数使用true,那是测试广告模式。

        接着是一些回调方法:

        ?

          @Override
        1. protectedvoidonStart() {
        2. super.onStart();
        3. voidonReceiveAd() {
        4. Log.e(LOG_TAG,"onReceiveAd");
        5. // 接收到全屏广告。加载全屏广告并展示
        6. displayer.preLoadFullScreenAd();
        7. @Override
        8. voidonLoadAdComplete() {
        9. "onLoadAdComplete");
        10. // 成功完成下载后,展示广告
        11. //layout = (RelativeLayout) findViewById(R.id.layout);
        12. voidonFailedToReceiveAd(ErrorCode errorCode) {
        13. "onFailedToReceiveAd");
        14. if(errorCode.getErrorCode() ==36) {
        15. // 下载广告资源失败,此次广告无法显示
        16. "onFailedToReceiveAd downloading resources failed.");
        17. voidonAdDismiss() {
        18. //TODO 广告关闭回调接口
        19. "onAdDismiss");
        20. voidonDestroy() {
        21. super.onDestroy();
        22. "onDestroy");
        23. // 请在这里释放全屏广告资源
        24. if(displayer !=null) {
        25. displayer.dismissDisplayer();
        26. displayer =null;
        27. }
          voidonStart(){
        1. voidonReceiveAd(){
        2. Log.e(LOG_TAG,204); background-color:inherit">//接收到全屏广告。加载全屏广告并展示
        3. displayer.preLoadFullScreenAd();
        4. voidonLoadAdComplete(){
        5. //成功完成下载后,展示广告
        6. //layout=(RelativeLayout)findViewById(R.id.layout);
        7. voidonFailedToReceiveAd(ErrorCodeerrorCode){
        8. if(errorCode.getErrorCode()==36){
        9. //下载广告资源失败,此次广告无法显示
        10. "onFailedToReceiveAddownloadingresourcesfailed.");
        11. voidonAdDismiss(){
        12. //TODO广告关闭回调接口
        13. voidonDestroy(){
        14. //请在这里释放全屏广告资源
        15. if(displayer!=null){
        16. displayer.dismissDisplayer();
        17. displayer=最后是用jin来调用显示广告的代码,这样会比较灵活:

          ?

            staticvoidshowMyAD(){
          1. displayer.displayFullScreenAd(mGLSurfaceView);
            1. displayer.displayFullScreenAd(mGLSurfaceView);
            2. 上面 我把广告显示到了cocos2d-x的视图里,所以得在com.cocos2dx.lib里的cocos2dxActivity.java里修改下声明:

              ?

                staticCocos2dxGLSurfaceView mGLSurfaceView;
                staticCocos2dxGLSurfaceViewmGLSurfaceView;

              最后在mainfest.xml里加上显示点击广告的activity,并且设置好权限即可完成插屏广告的添加,最后祝愿开发者们多赚money。

              http://blog.csdn.net/wiyun_beijing/article/details/17912431

              相关文章

                  本文实践自 RayWenderlich、Ali Hafizji 的文章《...
              Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
              第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
                  Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
              1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
                 Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...