穿山甲的SDK文档挺不友好的 所以自己写一个总结 避免以后再被坑
首先这个
自3400版本开始,穿山甲支持了Android R,引入了Android R的 <queries> 标签,需要对gradle版本进行限制,限制范围为:3.3.3、 3.4.3、 3.5.4、3.6.4、4.0.1 ,开发者根据自身情况酌情升级
注意的是Gradle 是studio的 file->project Structure 里面的 Android Gradle Plugin Version版本 而不是Gardle Version (这是个坑)
我用的是3.3.3版本 因为这个不用再去修改其他的代码 creator也支持 (版本太高会出现编译后报错!)
所以直接在 Android Gradle Plugin Version那一栏一下输入3.3.3后studio会直接编译
版本的问题先解决了 不然会出现<queries> 的报错哦
之后就是先添加sdk文件
在studio 打包好的项目里的app文件夹里添加libs文件夹 把下载下来的sdk放进去
然后creator编译过后是已经有引用aar文件的 不需要再去Gradle里面添加官方的那句话了(我注释的那句)
做完上面那步之后重新编译studio 如果出现下图的这个 就是引入成功了
之后配置AndroidManifest
先添加权限 跟官方的一样就好了
然后要添加官方说的这个到代码里
添加完这个会发现 这个file_paths 报红 就是需要去添加这个文件 在studio项目的 res里面新建一个xml文件夹 把官方给的代码贴进去(去官方复制哈 不知道不同版本有没有做修改)
然后把官方说的这个加进来
代码里面是app的gradle里面的defaultConfig加上这个
然后加上这个 对应creator的打包APP ABI (否则会出错哦)
然后根据穿山甲官方文档添加这个 接入就差不多成功了
之后就是代码
在你项目跟SDKWrapper里面的同一个文件夹里添加这个文件 下面是代码(下载的sdk里面demo里面有这个文件)
package org.cocos2dx.javascript; import android.content.Context; import android.util.Log; import com.bytedance.sdk.openadsdk.TTAdConfig; import com.bytedance.sdk.openadsdk.TTAdConstant; import com.bytedance.sdk.openadsdk.TTAdManager; import com.bytedance.sdk.openadsdk.TTAdSdk; /** * 可以用一个单例来保存TTAdManager实例,在需要初始化sdk的时候调用 */ public class TTAdManagerHolder { private static final String TAG = "TTAdManagerHolder"; private static boolean sInit; public static TTAdManager get() { if (!sInit) { throw new RuntimeException("TTAdSdk is not init, please check."); } return TTAdSdk.getAdManager(); } public static void init(final Context context) { doInit(context); } //step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明 private static void doInit(Context context) { if (!sInit) { //TTAdSdk.init(context, buildConfig(context)); TTAdSdk.init(context, buildConfig(context), new TTAdSdk.InitCallback() { @Override public void success() { Log.i(TAG, "success: "); } @Override public void fail(int code, String msg) { Log.i(TAG, "fail: code = "+code+" msg = "+msg); } }); sInit = true; } } private static TTAdConfig buildConfig(Context context) { return new TTAdConfig.Builder() .appId("5188994") .useTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView .allowShowNotify(true) //是否允许sdk展示通知栏提示 .allowShowPageWhenScreenLock(true) // 锁屏下穿山甲SDK不会再出落地页,此API已废弃,调用没有任何效果 .debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用 .directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允许直接下载的网络状态集合 .supportMultiProcess(true)//是否支持多进程 .needClearTaskReset() //.httpStack(new MyOkStack3())//自定义网络库,demo中给出了okhttp3版本的样例,其余请自行开发或者咨询工作人员。 .build(); } }
然后就是在AppActivity里面添加以下代码
import android.util.Log;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdManager;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTRewardVideoAd;
//初始化代码
static public AppActivity activity;
private String TAG = "cocos日志";
private TTAdNative mTTAdNative;
private TTRewardVideoAd mttRewardVideoAd;
//穿山甲广告
TTAdManagerHolder.init(this);
activity = this;
//step1:初始化sdk
TTAdManager ttAdManager = TTAdManagerHolder.get();
//step2:(可选,强烈建议在合适的时机调用):申请部分权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题。
TTAdManagerHolder.get().requestPermissionIfNecessary(this);
//step3:创建TTAdNative对象,用于调用广告请求接口
mTTAdNative = ttAdManager.createAdNative(getApplicationContext());
loadAd("广告位id", TTAdConstant.VERTICAL);
最后在后面添加以下方法
//播放广告方法,js中调用此方法。传入广告位id codeId static public void showAd(String codeId) { Log.e(activity.TAG, "java广告方法"); activity.runOnUiThread(new Runnable() { @Override public void run() { if (activity.mttRewardVideoAd != null) { //step6:在获取到广告后展示 //该方法直接展示广告 activity.mttRewardVideoAd.showRewardVideoAd(activity); //展示广告,并传入广告展示的场景 activity.mttRewardVideoAd = null; } else { Log.e(activity.TAG, "请先加载广告"); } } }); } public void sendReward() { Log.e(activity.TAG,"奖励发放java调用"); activity.runOnGLThread(new Runnable() { @Override public void run() { String js = "JavaObjct.videoSuccess()"; Cocos2dxJavascriptJavaBridge.evalString(js); Log.e(activity.TAG,"奖励发放完毕"); } }); } private void loadAd(final String codeId, int orientation) { //step4:创建广告请求参数AdSlot,具体参数含义参考文档 Log.e(activity.TAG,"开始创建广告"); AdSlot adSlot = new AdSlot.Builder() .setCodeId(codeId) .setSupportDeepLink(true) .setImageAcceptedSize(1080, 1920) .setRewardAmount(1) //奖励的数量 .setUserID("")//用户id,必传参数,穿山甲后台可以看到你的用户id .setOrientation(orientation) //必填参数,期望视频的播放方向:TTAdConstant.HORIZONTAL 或 TTAdConstant.VERTICAL .build(); //step5:请求广告 mTTAdNative.loadRewardVideoAd(adSlot, new TTAdNative.RewardVideoAdListener() { @Override public void onError(int code, String message) { Log.e(TAG,"广告加载错误" +message); } @Override public void onRewardVideoAdLoad(TTRewardVideoAd ad) { Log.e(TAG, "视频广告已经加载"); mttRewardVideoAd = ad; mttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() { @Override public void onAdShow() { Log.e(TAG, "视频广告播放"); } @Override public void onAdVideoBarClick() { Log.e(TAG, "rewardVideoAd bar click"); } @Override public void onAdClose() { Log.e(TAG, "rewardVideoAd close"); //关闭后再次加载广告 loadAd(codeId, TTAdConstant.VERTICAL); } //视频播放完成回调 @Override public void onVideoComplete() { Log.e(TAG,"rewardVideoAd complete"); } @Override public void onVideoError() { Log.e(TAG,"rewardVideoAd error"); Log.e(activity.TAG,"奖励发放java调用"); activity.runOnGLThread(new Runnable() { @Override public void run() { String js = "JavaObjct.videoFail()"; Cocos2dxJavascriptJavaBridge.evalString(js); Log.e(activity.TAG,"视频播放失败"); } }); } //视频播放完成后,奖励验证回调,rewardVerify:是否有效,rewardAmount:奖励梳理,rewardName:奖励名称 @Override public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName, int var4, String var5) { Log.e(TAG,"广告播放完成回调"); //发放奖励 sendReward(); } @Override public void onSkippedVideo() { } }); } //视频广告加载后,视频资源缓存到本地的回调,在此回调后,播放本地视频,流畅不阻塞。 @Override public void onRewardVideoCached() { Log.e(TAG, "rewardVideoAd video cached"); } //视频广告的素材加载完毕,比如视频url等,在此回调后,可以播放在线视频,网络不好可能出现加载缓冲,影响体验。 @Override public void onRewardVideoCached(TTRewardVideoAd ad) { Log.e(TAG, ad+"rewardVideoAd video cached"); } // //视频广告的素材加载完毕,比如视频url等,在此回调后,可以播放在线视频,网络不好可能出现加载缓冲,影响体验。 // @Override // public void onRewardVideoAdLoad(TTRewardVideoAd ad) { // Log.e(TAG, "视频广告已经加载"); // mttRewardVideoAd = ad; // mttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() { // // @Override // public void onAdShow() { // Log.e(TAG, "视频广告播放"); // } // // @Override // public void onAdVideoBarClick() { // Log.e(TAG, "rewardVideoAd bar click"); // } // // @Override // public void onAdClose() { // Log.e(TAG, "rewardVideoAd close"); // //关闭后再次加载广告 // loadAd(codeId, TTAdConstant.VERTICAL); // } // // //视频播放完成回调 // @Override // public void onVideoComplete() { // Log.e(TAG,"rewardVideoAd complete"); // } // // @Override // public void onVideoError() { // Log.e(TAG,"rewardVideoAd error"); // } // // //视频播放完成后,奖励验证回调,rewardVerify:是否有效,rewardAmount:奖励梳理,rewardName:奖励名称 // @Override // public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName, int var4, String var5) { // Log.e(TAG,"广告播放完成回调"); // // //发放奖励 // sendReward(); // } // // @Override // public void onSkippedVideo() { // } // }); // } }); }
这样在cocos 里调用showAd方法就能播放广告啦