http://blog.csdn.net/wiyun_beijing/article/details/17912471
好吧,经过仔细研究,我发现其实在cocos2d-x的应用下添加的插屏广告,当用Jin调用代码时是在子线程中对UI进行操作,所以显然是不可能控制得了广告UI的,所以上一篇说的“无法添加”就当是屁话好了……反正我确实是只菜鸟……接下来把添加过程写出来,好让后继的菜鸟们能不费力的添加这类广告,甚至以自定义的方式来展示广告……
上面说过了用JIN调用插屏时是在子线程中操作UI,主线程UI不是安全线程,所以需要使用Handle来与主线程进行通信,让其在适时的时候按我们设定的方式去调用广告UI,下面是代码:
- public class GameActivity extends Cocos2dxActivity {
- private static InterstitialAd interstitialAd;
- public static final String PUBLISHER_ID = "56OJzCCIuNT9GZxMAZ";
- public static final String InlinePPID = "16TLmbLoAp3B1NUGss77M4ai";
- public static final String InterstitialPPID = "16TLmbLoAp3B1NUGs4bP4d9i";
- static DomobInterstitialAd mInterstitialAd;
- private static Handler mHandler;
- protected void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- mHandler = new Handler();
- mInterstitialAd = new DomobInterstitialAd(this, PUBLISHER_ID,
- InterstitialPPID, DomobInterstitialAd.INTERSITIAL_SIZE_300X250);
- mInterstitialAd.setInterstitialAdListener(new DomobInterstitialAdListener() {
- @Override
- public void onInterstitialAdReady() {
- Log.i("DomobSDKDemo", "onAdReady");
- }
- @Override
- public void onLandingPageOpen() {
- Log.i("DomobSDKDemo", "onLandingPageOpen");
- }
- @Override
- public void onLandingPageClose() {
- Log.i("DomobSDKDemo", "onLandingPageClose");
- }
- @Override
- public void onInterstitialAdPresent() {
- Log.i("DomobSDKDemo", "onInterstitialAdPresent");
- }
- @Override
- public void onInterstitialAdDismiss() {
- // Request new ad when the previous interstitial ad was closed.
- mInterstitialAd.loadInterstitialAd();
- Log.i("DomobSDKDemo", "onInterstitialAdDismiss");
- }
- @Override
- public void onInterstitialAdLeaveApplication() {
- Log.i("DomobSDKDemo", "onInterstitialAdLeaveApplication");
- }
- @Override
- public void onInterstitialAdClicked(DomobInterstitialAd arg0) {
- Log.i("DomobSDKDemo", "onInterstitialAdClicked");
- }
- @Override
- public void onInterstitialAdFailed(
- cn.domob.android.ads.DomobAdManager.ErrorCode arg0) {
- // TODO Auto-generated method stub
- Log.i("DomobSDKDemo", "onInterstitialAdFailed");
- }
- });
- mInterstitialAd.loadInterstitialAd();
- }
- public class GameActivity extends Cocos2dxActivity {
- private static InterstitialAd interstitialAd;
- public static final String PUBLISHER_ID = "56OJzCCIuNT9GZxMAZ";
- public static final String InlinePPID = "16TLmbLoAp3B1NUGss77M4ai";
- public static final String InterstitialPPID = "16TLmbLoAp3B1NUGs4bP4d9i";
- static DomobInterstitialAd mInterstitialAd;
- private static Handler mHandler;
- protected void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- mHandler = new Handler();
- mInterstitialAd = new DomobInterstitialAd(this, PUBLISHER_ID,
- InterstitialPPID, DomobInterstitialAd.INTERSITIAL_SIZE_300X250);
- mInterstitialAd.setInterstitialAdListener(new DomobInterstitialAdListener() {
- @Override
- public void onInterstitialAdReady() {
- Log.i("DomobSDKDemo", "onAdReady");
- }
- @Override
- public void onLandingPageOpen() {
- Log.i("DomobSDKDemo", "onLandingPageOpen");
- }
- @Override
- public void onLandingPageClose() {
- Log.i("DomobSDKDemo", "onLandingPageClose");
- }
- @Override
- public void onInterstitialAdPresent() {
- Log.i("DomobSDKDemo", "onInterstitialAdPresent");
- }
- @Override
- public void onInterstitialAdDismiss() {
- // Request new ad when the previous interstitial ad was closed.
- mInterstitialAd.loadInterstitialAd();
- Log.i("DomobSDKDemo", "onInterstitialAdDismiss");
- }
- @Override
- public void onInterstitialAdLeaveApplication() {
- Log.i("DomobSDKDemo", "onInterstitialAdLeaveApplication");
- }
- @Override
- public void onInterstitialAdClicked(DomobInterstitialAd arg0) {
- Log.i("DomobSDKDemo", "onInterstitialAdClicked");
- }
- @Override
- public void onInterstitialAdFailed(
- cn.domob.android.ads.DomobAdManager.ErrorCode arg0) {
- // TODO Auto-generated method stub
- Log.i("DomobSDKDemo", "onInterstitialAdFailed");
- }
- });
- mInterstitialAd.loadInterstitialAd();
- }
上面都是官方示例中的代码,下面是线程代码,:
- private static Runnable showMyADi = new Runnable() {
- public void run() {
- if (mInterstitialAd.isInterstitialAdReady()){
- mInterstitialAd.showInterstitialAd(GameActivity.getContext());
- } else {
- Log.i("DomobSDKDemo", "Interstitial Ad is not ready");
- mInterstitialAd.loadInterstitialAd();
- }
- }
- };
- private static Runnable showMyADi = new Runnable() {
- public void run() {
- if (mInterstitialAd.isInterstitialAdReady()){
- mInterstitialAd.showInterstitialAd(GameActivity.getContext());
- } else {
- Log.i("DomobSDKDemo", "Interstitial Ad is not ready");
- mInterstitialAd.loadInterstitialAd();
- }
- }
- };
最后是通过JIN来执行上面的代码:
- public static void showMyAD(){
- mHandler.post(showMyADi);
- }
- public static void showMyAD(){
- mHandler.post(showMyADi);
- }
调用后广告显示正常,点击正常……调试代码一片绿、蓝色……我想如果加聚合也这样调用的话应该差不多了……
///
最近完成了自己的一个小项目,理所当然地准备在应用里加些广告……不幸的是,我想要加的有着良好用户体验的插屏广告在cocos2d-x开发的android游戏下支持并不是很好,支持好的填充率估计又跟不上。多盟的插屏在android下可以强行加入,但试过是没法正常点击的。然后是艾德思奇,他的示例里没正常展示出插屏广告,但我在芒果聚合里可以看到正常显示一个广告的框架,admob不太适用于国内,有米和易传媒的插屏广告可以正常添加,但填充率大多时候很低,其它还有权限要得太高的就没试了,所以,如果打算在android下使用插屏广告的话首推的只有安沃了,他的Demo和多盟的一样运行很正常,算是我见过Demo里最好的两家了,至于哪个更适合赚钱,这个就仁者见仁,智者见智了,我只是不想让应用空着上路……
这里还要说下,在android下如果想在聚合里使用插屏广告基本是不可能的,因为添加插屏广告时有的是在sdk里全都写好了,只需要你调用代码,有的是需要你修改显示广告的视图或者context,所以直接使用聚合是没办法完全正确处理的,ios当然例外……下面说下如何在应用里添加安沃的插屏广告:
1.加sdk,这个估计都会,其实直接把包copy进libs目录就行
2.在cocos2d-x的activity里添加代码:
这里首先得添加广告监听接口:
- public class appActivity extends Cocos2dxActivity implements FullScreenAdListener{
- }
- public class appActivity extends Cocos2dxActivity implements FullScreenAdListener{
- }
然后声明需要用到的广告视图:
- private static AdDisplayer displayer;
- private static AdDisplayer displayer;
接着在onCreate里初始化并添加广告的类型设置,以及广告请求:
- // 请在manifest里面设置当前activity属性 android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
- // // 全屏广告实例
- displayer = AdDisplayer.getInstance(appActivity.this);
- // 初始化全屏广告参数
- displayer.initParems("5201f33630c542a0b851cb9325d744e2",true, appActivity.this);
- // 设置全屏格式
- /*
- * 可选参数有:AdDisplayer.ADWO_FS_INTERCEPT 插屏全屏
- * AdDisplayer.ADWO_FS_ENTRY
- * AdDisplayer.ADWO_FS_TRANSPOSITION
- */
- // displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);
- displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);
- // 设置请求广告类型 可选。
- displayer.setDesireAdType(AdDisplayer.ADWO_FS_TYPE_ALL);
- // 开始请求全屏广告
- displayer.requestFullScreenAd();
- // 请在manifest里面设置当前activity属性 android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
- // // 全屏广告实例
- displayer = AdDisplayer.getInstance(appActivity.this);
- // 初始化全屏广告参数
- displayer.initParems("5201f33630c542a0b851cb9325d744e2",true, appActivity.this);
- // 设置全屏格式
- /*
- * 可选参数有:AdDisplayer.ADWO_FS_INTERCEPT 插屏全屏
- * AdDisplayer.ADWO_FS_ENTRY
- * AdDisplayer.ADWO_FS_TRANSPOSITION
- */
- // displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);
- displayer.setDesireAdForm(AdDisplayer.ADWO_FS_INTERCEPT);
- // 设置请求广告类型 可选。
- displayer.setDesireAdType(AdDisplayer.ADWO_FS_TYPE_ALL);
- // 开始请求全屏广告
- displayer.requestFullScreenAd();
上面第一条注释也已经说明了,必须在要展示广告的activity里加上
- android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
- android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
否则是没法将广告按照全屏进行展示的,至于广告的类型就自己参考说明进行设置好了,注意在正式发布时可别在初始化时的第二个参数使用true,那是测试广告模式。
接着是一些回调方法:
- @Override
- protected void onStart() {
- super.onStart();
- }
- @Override
- public void onReceiveAd() {
- Log.e(LOG_TAG, "onReceiveAd");
- // 接收到全屏广告。加载全屏广告并展示
- displayer.preLoadFullScreenAd();
- }
- @Override
- public void onLoadAdComplete() {
- Log.e(LOG_TAG, "onLoadAdComplete");
- // 成功完成下载后,展示广告
- //layout = (RelativeLayout) findViewById(R.id.layout);
- }
- @Override
- public void onFailedToReceiveAd(ErrorCode errorCode) {
- Log.e(LOG_TAG, "onFailedToReceiveAd");
- if (errorCode.getErrorCode() == 36) {
- // 下载广告资源失败,此次广告无法显示
- Log.e(LOG_TAG, "onFailedToReceiveAd downloading resources failed.");
- }
- }
- @Override
- public void onAdDismiss() {
- //TODO 广告关闭回调接口
- Log.e(LOG_TAG, "onAdDismiss");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.e(LOG_TAG, "onDestroy");
- // 请在这里释放全屏广告资源
- if (displayer != null) {
- displayer.dismissDisplayer();
- displayer = null;
- }
- }
- @Override
- protected void onStart() {
- super.onStart();
- }
- @Override
- public void onReceiveAd() {
- Log.e(LOG_TAG, "onReceiveAd");
- // 接收到全屏广告。加载全屏广告并展示
- displayer.preLoadFullScreenAd();
- }
- @Override
- public void onLoadAdComplete() {
- Log.e(LOG_TAG, "onLoadAdComplete");
- // 成功完成下载后,展示广告
- //layout = (RelativeLayout) findViewById(R.id.layout);
- }
- @Override
- public void onFailedToReceiveAd(ErrorCode errorCode) {
- Log.e(LOG_TAG, "onFailedToReceiveAd");
- if (errorCode.getErrorCode() == 36) {
- // 下载广告资源失败,此次广告无法显示
- Log.e(LOG_TAG, "onFailedToReceiveAd downloading resources failed.");
- }
- }
- @Override
- public void onAdDismiss() {
- //TODO 广告关闭回调接口
- Log.e(LOG_TAG, "onAdDismiss");
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.e(LOG_TAG, "onDestroy");
- // 请在这里释放全屏广告资源
- if (displayer != null) {
- displayer.dismissDisplayer();
- displayer = null;
- }
- }
最后是用jin来调用显示广告的代码,这样会比较灵活:
- public static void showMyAD(){
- displayer.displayFullScreenAd(mGLSurfaceView);
- }
- public static void showMyAD(){
- displayer.displayFullScreenAd(mGLSurfaceView);
- }
上面 我把广告显示到了cocos2d-x的视图里,所以得在com.cocos2dx.lib里的cocos2dxActivity.java里修改下声明:
- protected static Cocos2dxGLSurfaceView mGLSurfaceView;
- protected static Cocos2dxGLSurfaceView mGLSurfaceView;
最后在mainfest.xml里加上显示点击广告的activity,并且设置好权限即可完成插屏广告的添加,最后祝愿开发者们多赚money。
http://blog.csdn.net/wiyun_beijing/article/details/17912431