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的时候就料到开头是前路坎坷多啊,没料到结尾却是一步一个坎啊,好在都弄完了,仅此留笔。