cocos creator2.4 导出安卓 接入穿山甲 视频广告 最详细 教程 附带js与java互调

首先非常感谢两位大神的经验分享,我也是参考这两位的教程 才能一个安卓小白的情况,实现cocos creator导出安卓接入穿山甲广告成功的。csdn 的 MrLizs 以及 橘子呀c

首先阅读MrLizs的教程贴,我大部分java代码都是在这里面复制的,会方便很多,一定要看清楚,里面的环境配置,还有安卓工程配置
https://blog.csdn.net/MrLizs/article/details/106728558
其次可以参考 橘子呀c 的教程贴,接入过程中遇到很多问题也是在这里找到灵感,banner广告接入我是参考他的后续教程的
https://blog.csdn.net/qq_34772097/article/details/101468072
另外也要参考穿山甲的接入文档。

接下来请先确保你安卓的环境配置正确 java 安装android studio 然后在里面安装ndk sdk 等等。我用的是android studio3.5,一般要求android studio3.0以上,这里推荐用android studio3.5,可能会避免版本问题导致的打包出错。
其实修改内容很少,但是为了和我一样的android小白少走弯路,我尽量每步都截图。文件路径说清楚。所以会显得文章偏长,没办法作为一个小白,太容易遇到坑了,打包apk你都不知道点哪个
下面是我cocos creator2.4构建项目的选项,APP ABI 这里我建议是全部勾选,因为我当时没有全选后面加好代码某些机型真机运行报错。


image.png

我是用cocos creator2.4 导出的正式安卓工程目录,(cocos creator导出的时候只要构建成功就好 ,编译步骤在android studio加入代码后再进行)下面图,是我用android studio打开 cocos creator项目根目录\build\jsb-default\frameworks\runtime-src\proj.android-studio (这个就是安卓工程的根目录 ), 我们大部分代码修改都是位于项目工程的app底下


image.png

接着我们在app文件夹底下新建libs文件夹 ,把下载的穿山甲sdk 文件中 open_ad_sdk.aar放入此文件夹内。如下图:


image.png

步骤一:修改build.gradle

文件路径jsb-default\frameworks\runtime-src\proj.android-studio\app\build.gradle
如果仔细看app文件夹底下的build.gradle 文件 就会知道里面已经自动引入了app/libs 文件夹底下所有的aar文件,但是接下来还要修改这个app文件夹底下的build.gradle文件(上图已经指出的文件)。
这是build.gradle原本的文件头部内容


image.png

我们需要在 android 内容里面加入一行

compileSdkVersion 28

在defaultConfig内容里面修改

  minSdkVersion 16     
  targetSdkVersion 28

并且加入

     ndk {
            //选择要添加的对应cpu类型的.so库。   // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }

修改后build.gradle如图下


image.png

然后在build.gradle文件里面 找到 dependencies 项在此内容里面添加一行代码;
我这边的情况是这行代码不加的话,后面运行项目始终报错找不到 open_ad_sdk 穿山甲sdk里面的广告代码文件,这个是我们公司的安卓大神帮我找到问题。我看上面几篇教程中并没有这一块的修改说明。也许他们的项目中没有遇到这个问题吧哈哈。这行代码你们如果加入报错可以先试着删除,不过一般是没什么问题的
如下图:

implementation 'com.android.support:appcompat-v7:28.0.0'      
image.png

步骤二:修改AndroidManifest.xml

文件路径
jsb-default\frameworks\runtime-src\proj.android-studio\app\AndroidManifest.xml
在app目录底下打开AndroidManifest.xml
首先添加申请权限代码,找到原本的 uses-permission 权限申请代码,在之后添加如下代码

    <!--    <!-必要的权限&ndash;&gt;-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
    <uses-permission android:name="android.permission.GET_TASKS"/>
    <!--最好能提供的权限-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <!-- 如果有相关视频的广告使用textureview播放,务必添加,不然黑屏 -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

修改后的如下图


image.png

接着在AndroidManifest.xml 文件中找到 application ,在application内容里面加上穿山甲广告需要的provider 代码

       <provider
                android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
                android:authorities="${applicationId}.TTFileProvider"
                android:exported="false"
                android:grantUriPermissions="true">
            <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths" />
        </provider>

        <provider
                android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
                android:authorities="${applicationId}.TTMultiProvider"
                android:exported="false" />

修改后如下图


image.png

步骤三 添加 file_paths.xml 文件

文件路径
jsb-default\frameworks\runtime-src\proj.android-studio\res\xml\file_paths.xml
首先在安卓根目录 proj.android-studio 文件夹底下找到 res文件夹 在里面新建 xml 文件夹,再于xml文件夹内新建 file_paths.xml 文件,文件路劲如上面已经给出
(另外插一句题外话,如果要修改cocos creator 导出的android项目中文名 res文件夹底下的values/strings.xml 文件里面修改,icon图标文件修改也是位于res文件夹底下mipmap)
文件内容代码

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!--为了适配所有路径可以设置 path = "." -->
    <external-path name="tt_external_root" path="." />
    <external-path name="tt_external_download" path="Download" />
    <external-files-path name="tt_external_files_download" path="Download" />
    <files-path name="tt_internal_file_download" path="Download" />
    <cache-path name="tt_internal_cache_download" path="Download" />
</paths>

如下图


image.png

步骤四 修改逻辑代码文件

文件路径
jsb-default\frameworks\runtime-src\proj.android-studio\src\org\cocos2dx\javascript
接下来是java调用穿山甲sdk展示广告了
首先在proj.android-studio\src\org\cocos2dx\javascript新建TTAdManagerHolder.java 穿山甲sdk配置代码文件,代码如下

package org.cocos2dx.javascript;

import android.content.Context;

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 boolean sInit;


    public static TTAdManager get() {
        if (!sInit) {
            throw new RuntimeException("TTAdSdk is not init, please check.");
        }
        return TTAdSdk.getAdManager();
    }

    public static void init(Context context) {
        doInit(context);
    }

    //step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明
    private static void doInit(Context context) {
        if (!sInit) {
            TTAdSdk.init(context, buildConfig(context));
            sInit = true;
        }
    }

    private static TTAdConfig buildConfig(Context context) {
        return new TTAdConfig.Builder()
                .appId("5001121")//这里填入穿山甲后台创建的应用id
                .useTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView
                .appName("你的应用名称" )
                .titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)
                .allowShowNotify(true) //是否允许sdk展示通知栏提示
                .allowShowPageWhenScreenLock(true) //是否在锁屏场景支持展示广告落地页
                .debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用
                .directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI) //允许直接下载的网络状态集合
                .supportMultiProcess(true) //是否支持多进程,true支持
                .asyncInit(true) //异步初始化sdk,开启可减少初始化耗时
                //.httpStack(new MyOkStack3())//自定义网络库,demo中给出了okhttp3版本的样例,其余请自行开发或者咨询工作人员。
                .build();
    }
}

android studio 中如下图


image.png

接着打开proj.android-studio\src\org\cocos2dx\javascript\AppActivity.java 文件
import 引入包的 代码下加入

import org.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;
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;

在AppActivity类里面加入如下代码

    //初始化代码
    static public AppActivity activity;
    private String TAG = "cocos日志";
    private TTAdNative mTTAdNative;
    private TTRewardVideoAd mttRewardVideoAd;

如下图


image.png

在AppActivity类里面的onCreate方法里面加入如下代码

        //穿山甲广告
        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);

如下图


image.png

在AppActivity里最底下增加以下方法:

    //播放广告方法,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 = "adController.adEnd()";
                Cocos2dxJavascriptJavaBridge.evalString(js);
                Log.e(activity.TAG,"奖励发放完毕");
            }
        });
    }

    private void loadAd(final String codeId, int orientation) {
        //step4:创建广告请求参数AdSlot,具体参数含义参考文档
        AdSlot adSlot = new AdSlot.Builder()
                .setCodeId(codeId)
                .setSupportDeepLink(true)
                .setImageAcceptedSize(1080, 1920)
                .setRewardAmount(1)  //奖励的数量
                .setUserID("1111")//用户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 onRewardVideoCached() {
                Log.e(TAG, "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() {
                    }
                });
            }
        });
    }

如下图


image.png

image.png

另外提一句,大家看看就好。上面的java代码中方法是会随着穿山甲sdk变动的,不过频率还是比较低的。要注意结合穿山甲官方文档和demo。比如onRewardVerify这个方法,老版本是只有三个参数,我从别的教程中复制的代码也只有三个参数,2020-11-24号下载的sdk中封装的onRewardVerify是五个参数,所以运行报错。之后看到的文档中是五个参数,所以这块也要改成五个参数,大家根据自己的情况决定。反正报错这块多看日志多百度。我也是安卓小白,但也能解决。

这个时候编辑器报错,关于sdk的引入这些文件都有红线,可以点击android studio 按钮file-》invalidate 按钮重启,这样编辑器就能识别到文件并且ctrl+鼠标左键点击就可以跳转

或者鼠标双击类名 然后alt+enter 键可以import class引入类


image.png

这里点击真机运行选择你要编译的项目,项目运行成功,广告播放成功

image.png

以下为补充说明

另外记得选中你自己的项目名而不是instantapp ,我们修改的文件夹都是proj.android-studio\app底下的build.gradle AndroidManifest.xml 还有skd文件夹libs也是放于app目录下。如果想编译instant,记得把app文件夹底下的修改,在proj.android-studio\game文件夹底下找到相应的文件一起改。
打包测试


image.png

如果遇到真机运行正常,打测试包build APKS 的时候报错没有找到穿山甲sdk,可以修改 proj.android-studio\settings.gradle,将:instantapp去掉,这样就不会编译instantapp,如下图


image.png

关于js调用java播放广告代码,js 代码 再你想要播放广告的时候

    /**
     * js调用java广告播放
     * @param type 区分回调事件
     * @param paragram 回调事件的参数
     */
    adPlay(type,paragram=false){
        this.adType = type;
        this.adParagram = paragram;
        if(cc.sys.isNative && cc.sys.os == cc.sys.OS_ANDROID) {
            cc.log('广告播放')
            jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "showAd","(Ljava/lang/String;)V","你的广告位id");
        }
    },

关于java调用js 广告回调代码 j
java方面代码位于AppActivity类修改 sendReward方法中

              //  java调用js的全局方法adController的子方法adEnd()
              String js = "adController.adEnd()";
              Cocos2dxJavascriptJavaBridge.evalString(js);

js方面代码声明全局方法adEnd,记得在onload里面,调用广告前初始化

    /**
     * js端广告回调全局方法
     */
        var self = this;
        let foo = {
            adEnd : function(){
                console.info("js端广告回调成功");
                //复活
                if(self.adType  == "复活"){
                    self.revivalAction((self.paragram);
                }
        }
        window["adController"]=foo;

最后补充一个坑,如果遇到,真机调试可以,打包测试包也可以,但是打包正式包报错有proguard字眼的。且试过加了穿山甲文档中混淆代码没用的。可以试试我这个方法,禁用proguard,但是不推荐。修改proj.android-studio\app\build.gradle文件 ,搜索找到minifyEnabled 与 shrinkResources 修改为false,我是个安卓小白,暂时找不到更好的办法。这个坑当时困扰很久,幸得群里面道友指点。果然还是做php后端还有小程序网站更适合我

    minifyEnabled false
    shrinkResources false

最后,如果文章对你有帮助记得点赞喔,如果接入过程遇到其他问题,可以在下方留言,我会不定时看下问题,解答我会的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容