CocosCreator接入穿山甲广告3-底部banner

SDK初始化的问题我就不在继续说了,前面的文章说过了,直接说接banner的逻辑,说到这banner确实是有些麻烦,因为demo给的工程是一个android工程,和游戏的android工程还有些不一样,所以这里也出现的一点问题,后续我慢慢说。其实逻辑和demo里的调用逻辑是一样的,只不过我们需要自己去创建一个空的view,为什么呢,如果你按照他的流程走过一遍之后你会发现,banner渲染成功了,但是并没有展示,仔细在一看其实他是加载成功banner后会返回给你一个view,你需要自己去创建一个空的view可以比作一个容器去承载这个banner一直悬浮在屏幕上,可在游戏在android中用的是Cocos2dxGLSurfaceView,所以如果你和工程里demo一样使用
setContentView(R.layout.activity_native_express);这方法去创建一个view那么你最后是会显示banner但是你游戏的画面就不会渲染了(除了banner其他地方都是黑屏),那么要怎么解决这个问题?我们可以创建一个空view然后嵌入在cocos的界面上就解决了,但是要怎么做,我也是看了这个链接才有的解决办法https://my.oschina.net/valiancer/blog/3063401。好废话不多说直接上代码逻辑,
首先在你之前创建好的res文件夹下面创建一个layout文件夹,然后创建一个名为activity_native_express的xml文件代码如下



    
    android:layout_alignParentBottom="true"/>

这样我们就创建了一个空的…额这个算是一个空的view吧,我不懂android不懂怎么称呼,就算是我们的容器创建完了然后在主要逻辑中引用一下,代码如下

//在oncreate中调用
public  void creatrView(){
  //原生的view直接添加到cocos的view内
  //R代表你是哪个包名的R文件,然后把创建好的view嵌入在你的cocosview里,不要使用setContentView(R.layout.activity_native_express);创建view
    View layout = LayoutInflater.from(this).inflate(R.layout.activity_native_express, null);
    mFrameLayout.addView(layout);
    mExpressContainer = (RelativeLayout) findViewById(R.id.express_container);
    //mFrameLayout.addView(view, layoutParams);
   //如已绘制SurfaceView则在surfaceView上一层绘制,必须addView之后使用
    //getGLSurfaceView().setZOrderMediaOverlay(true);
    //cocos的view是否在上层
    //getGLSurfaceView().setZOrderOnTop(true);
    getGLSurfaceView().getHolder().setFormat(PixelFormat.TRANSLUCENT);
}

创建好了view之后我们就可以按照正常逻辑继续往下走了,代码如下

//初始化banner广告
public void chuanShanJiaInitBanner(){
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    //step2:创建TTAdNative对象,用于调用广告请求接口,createAdNative(Context context) 插屏广告context需要传入Activity对象
    mTTBannerAdNative = TTAdManagerHolder.get().createAdNative(getApplicationContext());
    //step3:(可选,强烈建议在合适的时机调用):申请部分权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题。
    TTAdManagerHolder.get().requestPermissionIfNecessary(this);
}
//加载banner广告 在你需要加载广告的时候调用,
public static void loadBanner(final String placementId,final String adsSign){
    Log.e("andoird调用加载banner广告","loadBanner");
    //不在OnUiThread这个线程中调用肯定会报错
    this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
           //显示
            mExpressContainer.setVisibility(View.VISIBLE);
        }
    });
    float expressViewWidth = 600;
    float expressViewHeight = 150;
    //step4:创建广告请求参数AdSlot,具体参数含义参考文档
    AdSlot adSlot = new AdSlot.Builder()
            .setCodeId("广告位id") //
            .setSupportDeepLink(true)
            .setAdCount(1) //请求广告数量为1到3条
            .setExpressViewAcceptedSize(expressViewWidth,expressViewHeight) //期望模板广告view的size,单位dp
            .setImageAcceptedSize(600,150 )//这个参数设置即可,不影响模板广告的size
            .build();
    //step5:请求广告,对请求回调的广告作渲染处理
    mTTBannerAdNative.loadBannerExpressAd(adSlot, new TTAdNative.NativeExpressAdListener() {
        @Override
        public void onError(int code, String message) {
            Log.e("加载banner出现错误",message);
            //mExpressContainer.removeAllViews();
        }

        @Override
        public void onNativeExpressAdLoad(List ads) {
            if (ads == null || ads.size() == 0){
                return;
            }
            mTTBanner = ads.get(0);
            bindBannerListener(mTTBanner);
            mTTBanner.render();
        }
    });
}
//绑定Banner的回调事件
private static void bindBannerListener(TTNativeExpressAd ad) {
    ad.setExpressInteractionListener(new TTNativeExpressAd.ExpressAdInteractionListener() {
        @Override
        public void onAdClicked(View view, int type) {
            Log.e("Banner被点击","点击");
        }

        @Override
        public void onAdShow(View view, int type) {
            Log.e("广告Banner展示成功","successful");
        }

        @Override
        public void onRenderFail(View view, String msg, int code) {
            //Log.e("ExpressView","render fail:"+(System.currentTimeMillis() - startTime));
            //TToast.show(mContext, msg+" code:"+code);
            Log.e("广告Banner渲染失败","Fail");
        }

        @Override
        public void onRenderSuccess(View view, float width, float height) {
            Log.e("广告Banner渲染成功","successful");
            //Log.e("ExpressView","render suc:"+(System.currentTimeMillis() - startTime));
            //返回view的宽高 单位 dp
            //TToast.show(mContext, "渲染成功");
            mExpressContainer.addView(view);                    
             }
    });
      if (ad.getInteractionType() != TTAdConstant.INTERACTION_TYPE_DOWNLOAD){
        return;
    }
    ad.setDownloadListener(new TTAppDownloadListener() {
        @Override
        public void onIdle() {
            //TToast.show(BannerExpressActivity.this, "点击开始下载", Toast.LENGTH_LONG);
        }

        @Override
        public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) {
            Log.e("下载中",appName);
        }

        @Override
        public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) {
            //TToast.show(BannerExpressActivity.this, "下载暂停,点击继续", Toast.LENGTH_LONG);
        }

        @Override
        public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) {
            //TToast.show(BannerExpressActivity.this, "下载失败,点击重新下载", Toast.LENGTH_LONG);
        }

        @Override
        public void onInstalled(String fileName, String appName) {
            //TToast.show(BannerExpressActivity.this, "安装完成,点击图片打开", Toast.LENGTH_LONG);
        }

        @Override
        public void onDownloadFinished(long totalBytes, String fileName, String appName) {
            //TToast.show(BannerExpressActivity.this, "点击安装", Toast.LENGTH_LONG);
        }
    });
}
//关闭广告销毁banner 如果你不需要广告显示,可以在想关闭的地方调用,也就是隐藏掉
public static void closeBanner(final String placementId,final String adsSign){
    Instance.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            mExpressContainer.setVisibility(View.GONE);
        }
    });

    if (mTTBanner != null) {
        mTTBanner.destroy();
    }
}

好了,到此为止三部分我都说完了,我难受了两天接穿山甲的广告,不过还好的是弄完了,这其中出现很多的问题都需要慢慢解决才好,对了,还没说一下,如果你在打包的时候可能会出现警告过多而导致打包失败,我说的是正式版的包啊,
错误是这个“transformClassesAndResourcesWithProguardForRelease”,应该是混淆代码的问题吧,导致了我的警告有点多,然后直接打包失败了,因为android这部分我确实不太懂,以及代码混淆,所以我直接在proguard-rules.pro这个文件下添加了-ignorewarning这个,忽略警告…虽然这样不太好,关键是没有一位android大神给我指点一下这些问题,我这全靠自己一个不懂android会点游戏的在这接android的sdk,so最后忽略了警告也确实是打出正式包了,这个问题的解决也是在这个链接下看到的https://www.cnblogs.com/wood3/p/7018280.html,我弄android的时候就料到开头是前路坎坷多啊,没料到结尾却是一步一个坎啊,好在都弄完了,仅此留笔。

你可能感兴趣的:(AndroidStudio,Cocos,Creator)