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

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

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

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

[html]  view plain copy print ?
  1. public class GameActivity extends Cocos2dxActivity { 
  2.      private static InterstitialAd interstitialAd; 
  3.         public static final String PUBLISHER_ID = "56OJzCCIuNT9GZxMAZ"
  4.         public static final String InlinePPID = "16TLmbLoAp3B1NUGss77M4ai"
  5.         public static final String InterstitialPPID = "16TLmbLoAp3B1NUGs4bP4d9i"
  6.         static DomobInterstitialAd mInterstitialAd; 
  7.                 private static  Handler mHandler;  
  8.  
  9.                 protected void onCreate(Bundle savedInstanceState){ 
  10.         super.onCreate(savedInstanceState); 
  11.  
  12.  
  13.          
  14.            mHandler = new Handler();   
  15.                mInterstitialAd = new DomobInterstitialAd(this, PUBLISHER_ID, 
  16.                         InterstitialPPID, DomobInterstitialAd.INTERSITIAL_SIZE_300X250); 
  17.  
  18.                  
  19.                 mInterstitialAd.setInterstitialAdListener(new DomobInterstitialAdListener() { 
  20.                     @Override 
  21.                     public void onInterstitialAdReady() { 
  22.                         Log.i("DomobSDKDemo", "onAdReady"); 
  23.                     } 
  24.  
  25.                     @Override 
  26.                     public void onLandingPageOpen() { 
  27.                         Log.i("DomobSDKDemo", "onLandingPageOpen"); 
  28.                     } 
  29.  
  30.                     @Override 
  31.                     public void onLandingPageClose() { 
  32.                         Log.i("DomobSDKDemo", "onLandingPageClose"); 
  33.                     } 
  34.  
  35.                     @Override 
  36.                     public void onInterstitialAdPresent() { 
  37.                         Log.i("DomobSDKDemo", "onInterstitialAdPresent"); 
  38.                     } 
  39.  
  40.                     @Override 
  41.                     public void onInterstitialAdDismiss() { 
  42.                         // Request new ad when the previous interstitial ad was closed. 
  43.                         mInterstitialAd.loadInterstitialAd(); 
  44.                         Log.i("DomobSDKDemo", "onInterstitialAdDismiss"); 
  45.                     } 
  46.  
  47.  
  48.  
  49.                     @Override 
  50.                     public void onInterstitialAdLeaveApplication() { 
  51.                         Log.i("DomobSDKDemo", "onInterstitialAdLeaveApplication"); 
  52.                          
  53.                     } 
  54.  
  55.                     @Override 
  56.                     public void onInterstitialAdClicked(DomobInterstitialAd arg0) { 
  57.                         Log.i("DomobSDKDemo", "onInterstitialAdClicked"); 
  58.                     } 
  59.  
  60.                     @Override 
  61.                     public void onInterstitialAdFailed( 
  62.                             cn.domob.android.ads.DomobAdManager.ErrorCode arg0) { 
  63.                         // TODO Auto-generated method stub 
  64.                         Log.i("DomobSDKDemo", "onInterstitialAdFailed");     
  65.                     } 
  66.                 }); 
  67.                  
  68.                 mInterstitialAd.loadInterstitialAd(); 
  69.  
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class GameActivity extends Cocos2dxActivity {  
  2.      private static InterstitialAd interstitialAd;  
  3.         public static final String PUBLISHER_ID = "56OJzCCIuNT9GZxMAZ";  
  4.         public static final String InlinePPID = "16TLmbLoAp3B1NUGss77M4ai";  
  5.         public static final String InterstitialPPID = "16TLmbLoAp3B1NUGs4bP4d9i";  
  6.         static DomobInterstitialAd mInterstitialAd;  
  7.                 private static  Handler mHandler;   
  8.   
  9.                 protected void onCreate(Bundle savedInstanceState){  
  10.         super.onCreate(savedInstanceState);  
  11.   
  12.   
  13.           
  14.            mHandler = new Handler();    
  15.                mInterstitialAd = new DomobInterstitialAd(this, PUBLISHER_ID,  
  16.                         InterstitialPPID, DomobInterstitialAd.INTERSITIAL_SIZE_300X250);  
  17.   
  18.                   
  19.                 mInterstitialAd.setInterstitialAdListener(new DomobInterstitialAdListener() {  
  20.                     @Override  
  21.                     public void onInterstitialAdReady() {  
  22.                         Log.i("DomobSDKDemo", "onAdReady");  
  23.                     }  
  24.   
  25.                     @Override  
  26.                     public void onLandingPageOpen() {  
  27.                         Log.i("DomobSDKDemo", "onLandingPageOpen");  
  28.                     }  
  29.   
  30.                     @Override  
  31.                     public void onLandingPageClose() {  
  32.                         Log.i("DomobSDKDemo", "onLandingPageClose");  
  33.                     }  
  34.   
  35.                     @Override  
  36.                     public void onInterstitialAdPresent() {  
  37.                         Log.i("DomobSDKDemo", "onInterstitialAdPresent");  
  38.                     }  
  39.   
  40.                     @Override  
  41.                     public void onInterstitialAdDismiss() {  
  42.                         // Request new ad when the previous interstitial ad was closed.  
  43.                         mInterstitialAd.loadInterstitialAd();  
  44.                         Log.i("DomobSDKDemo", "onInterstitialAdDismiss");  
  45.                     }  
  46.   
  47.   
  48.   
  49.                     @Override  
  50.                     public void onInterstitialAdLeaveApplication() {  
  51.                         Log.i("DomobSDKDemo", "onInterstitialAdLeaveApplication");  
  52.                           
  53.                     }  
  54.   
  55.                     @Override  
  56.                     public void onInterstitialAdClicked(DomobInterstitialAd arg0) {  
  57.                         Log.i("DomobSDKDemo", "onInterstitialAdClicked");  
  58.                     }  
  59.   
  60.                     @Override  
  61.                     public void onInterstitialAdFailed(  
  62.                             cn.domob.android.ads.DomobAdManager.ErrorCode arg0) {  
  63.                         // TODO Auto-generated method stub  
  64.                         Log.i("DomobSDKDemo", "onInterstitialAdFailed");      
  65.                     }  
  66.                 });  
  67.                   
  68.                 mInterstitialAd.loadInterstitialAd();  
  69.   
  70.  }  

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

[html]  view plain copy print ?
  1. private static Runnable showMyADi = new Runnable() {   
  2.     public void run() {   
  3.      
  4.         if (mInterstitialAd.isInterstitialAdReady()){ 
  5.             mInterstitialAd.showInterstitialAd(GameActivity.getContext()); 
  6.         } else { 
  7.             Log.i("DomobSDKDemo", "Interstitial Ad is not ready"); 
  8.             mInterstitialAd.loadInterstitialAd(); 
  9.         }    
  10.     }   
  11. }; 
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. private static Runnable showMyADi = new Runnable() {    
  2.     public void run() {    
  3.       
  4.         if (mInterstitialAd.isInterstitialAdReady()){  
  5.             mInterstitialAd.showInterstitialAd(GameActivity.getContext());  
  6.         } else {  
  7.             Log.i("DomobSDKDemo", "Interstitial Ad is not ready");  
  8.             mInterstitialAd.loadInterstitialAd();  
  9.         }     
  10.     }    
  11. };  
上面通过判断插屏广告是否加载成功进行显示或者重新请求。

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

[html]  view plain copy print ?
  1. public static void showMyAD(){ 
  2.  
  3.     mHandler.post(showMyADi);  
  4.  
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public static void showMyAD(){  
  2.   
  3.     mHandler.post(showMyADi);   
  4.   
  5. }  

调用后广告显示正常,点击正常……调试代码一片绿、蓝色……我想如果加聚合也这样调用的话应该差不多了……

///

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

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

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

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

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

[java]  view plain copy print ?
  1. public  class appActivity extends Cocos2dxActivity implements FullScreenAdListener{ 
  2.  
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public  class appActivity extends Cocos2dxActivity implements FullScreenAdListener{  
  2.   
  3. }  

然后声明需要用到的广告视图:

[java]  view plain copy print ?
  1. private static AdDisplayer displayer; 
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. private static AdDisplayer displayer;  

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

[java]  view plain copy print ?
  1. //      请在manifest里面设置当前activity属性     android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 
  2.         // // 全屏广告实例 
  3.         displayer = AdDisplayer.getInstance(appActivity.this); 
  4.         // 初始化全屏广告参数 
  5.         displayer.initParems("5201f33630c542a0b851cb9325d744e2",true, appActivity.this); 
  6.         // 设置全屏格式 
  7.         /*
  8.          * 可选参数有:AdDisplayer.ADWO_FS_INTERCEPT 插屏全屏
  9.          *         AdDisplayer.ADWO_FS_ENTRY
  10.          *         AdDisplayer.ADWO_FS_TRANSPOSITION
  11.          */ 
  12. //      displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT); 
  13.         displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT); 
  14.         // 设置请求广告类型 可选。 
  15.         displayer.setDesireAdType(AdDisplayer.ADWO_FS_TYPE_ALL); 
  16.         // 开始请求全屏广告 
  17.         displayer.requestFullScreenAd(); 
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //      请在manifest里面设置当前activity属性     android:configChanges="keyboard|keyboardHidden|orientation|screenSize"  
  2.         // // 全屏广告实例  
  3.         displayer = AdDisplayer.getInstance(appActivity.this);  
  4.         // 初始化全屏广告参数  
  5.         displayer.initParems("5201f33630c542a0b851cb9325d744e2",true, appActivity.this);  
  6.         // 设置全屏格式  
  7.         /*  
  8.          * 可选参数有:AdDisplayer.ADWO_FS_INTERCEPT 插屏全屏 
  9.          *         AdDisplayer.ADWO_FS_ENTRY 
  10.          *         AdDisplayer.ADWO_FS_TRANSPOSITION 
  11.          */  
  12. //      displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);  
  13.         displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);  
  14.         // 设置请求广告类型 可选。  
  15.         displayer.setDesireAdType(AdDisplayer.ADWO_FS_TYPE_ALL);  
  16.         // 开始请求全屏广告  
  17.         displayer.requestFullScreenAd();  

上面第一条注释也已经说明了,必须在要展示广告的activity里加上
[java]  view plain copy print ?
  1. android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. android:configChanges="keyboard|keyboardHidden|orientation|screenSize"  

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

接着是一些回调方法:

[java]  view plain copy print ?
  1. @Override 
  2.     protected void onStart() { 
  3.         super.onStart(); 
  4.  
  5.          
  6.     } 
  7.     @Override 
  8.     public void onReceiveAd() { 
  9.         Log.e(LOG_TAG, "onReceiveAd"); 
  10.         // 接收到全屏广告。加载全屏广告并展示 
  11.         displayer.preLoadFullScreenAd(); 
  12.     } 
  13.  
  14.     @Override 
  15.     public void onLoadAdComplete() { 
  16.         Log.e(LOG_TAG, "onLoadAdComplete"); 
  17.         // 成功完成下载后,展示广告 
  18.         //layout = (RelativeLayout) findViewById(R.id.layout); 
  19.          
  20.     } 
  21.  
  22.     @Override 
  23.     public void onFailedToReceiveAd(ErrorCode errorCode) { 
  24.         Log.e(LOG_TAG, "onFailedToReceiveAd"); 
  25.         if (errorCode.getErrorCode() == 36) { 
  26.             // 下载广告资源失败,此次广告无法显示 
  27.             Log.e(LOG_TAG, "onFailedToReceiveAd downloading resources failed."); 
  28.         } 
  29.  
  30.     } 
  31.  
  32.     @Override 
  33.     public void onAdDismiss() { 
  34.         //TODO 广告关闭回调接口 
  35.         Log.e(LOG_TAG, "onAdDismiss"); 
  36.     } 
  37.  
  38.     @Override 
  39.     protected void onDestroy() { 
  40.         super.onDestroy(); 
  41.         Log.e(LOG_TAG, "onDestroy"); 
  42.         // 请在这里释放全屏广告资源 
  43.         if (displayer != null) { 
  44.             displayer.dismissDisplayer(); 
  45.             displayer = null
  46.         } 
  47.     } 
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2.     protected void onStart() {  
  3.         super.onStart();  
  4.   
  5.           
  6.     }  
  7.     @Override  
  8.     public void onReceiveAd() {  
  9.         Log.e(LOG_TAG, "onReceiveAd");  
  10.         // 接收到全屏广告。加载全屏广告并展示  
  11.         displayer.preLoadFullScreenAd();  
  12.     }  
  13.   
  14.     @Override  
  15.     public void onLoadAdComplete() {  
  16.         Log.e(LOG_TAG, "onLoadAdComplete");  
  17.         // 成功完成下载后,展示广告  
  18.         //layout = (RelativeLayout) findViewById(R.id.layout);  
  19.           
  20.     }  
  21.   
  22.     @Override  
  23.     public void onFailedToReceiveAd(ErrorCode errorCode) {  
  24.         Log.e(LOG_TAG, "onFailedToReceiveAd");  
  25.         if (errorCode.getErrorCode() == 36) {  
  26.             // 下载广告资源失败,此次广告无法显示  
  27.             Log.e(LOG_TAG, "onFailedToReceiveAd downloading resources failed.");  
  28.         }  
  29.   
  30.     }  
  31.   
  32.     @Override  
  33.     public void onAdDismiss() {  
  34.         //TODO 广告关闭回调接口  
  35.         Log.e(LOG_TAG, "onAdDismiss");  
  36.     }  
  37.   
  38.     @Override  
  39.     protected void onDestroy() {  
  40.         super.onDestroy();  
  41.         Log.e(LOG_TAG, "onDestroy");  
  42.         // 请在这里释放全屏广告资源  
  43.         if (displayer != null) {  
  44.             displayer.dismissDisplayer();  
  45.             displayer = null;  
  46.         }  
  47.     }  

最后是用jin来调用显示广告的代码,这样会比较灵活:

[java]  view plain copy print ?
  1. public static void showMyAD(){ 
  2.     displayer.displayFullScreenAd(mGLSurfaceView); 
  3.  
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public static void showMyAD(){  
  2.     displayer.displayFullScreenAd(mGLSurfaceView);  
  3.   
  4. }  

上面 我把广告显示到了cocos2d-x的视图里,所以得在com.cocos2dx.lib里的cocos2dxActivity.java里修改下声明:

[java]  view plain copy print ?
  1. protected static Cocos2dxGLSurfaceView mGLSurfaceView; 
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. protected static Cocos2dxGLSurfaceView mGLSurfaceView;  

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值