Cocos Creator AdSet对接文档

Android

重要说明

在做cocos creator广告sdk对接前,请先看下列说明。

1、cocos最低支持的安卓sdk是21对应安卓5.0.0,targetSdkVersion不能低于28。由于不同版本的cocos create 生成的Android studio项目不同, 请检查配置Android studio项目根目录的gradle.properties文件

2、gradle版本不能低于5.4.1,gradle插件版本不能低于3.5.4,对于cocos creator2.x的版本,由于默认生成的Android studio项目gradle和gradle 插件版本过低,需要设置调整。gradle插件版本设置在Android studio项目根目录的build.gradle设置,gradle版本在Android studio项目根目录的 gradle/wrapper/gradle-wrapper.properties文件设置

2、对于一些cocos造成的bug,我们不负责解答,包括但不限于

① cocos create 3.0.0-3.3.2在Android11以上系统闪退的问题

② cocos create 3.0.0调用 sys.os == sys.OS.ANDROID && sys.isNative判断系统环境时导致卡死的问题(去掉判断就好)

3、对于cocos create3.6.* 以上的版本,默认构建后的Android studio项目使用了Androidx,但是sdk中有使用到support包,请在Android studio项目 的根目录的gradle.properties文件里面增加配置。 android.enableJetifier=true,将sdk的support包自动转成Androidx包,如果已配置请忽略。

4、对于任意cocos creator版本,请在Android studio 项目根目录的gradle.properties文件增加配置 org.gradle.jvmargs=-Xmx4608m,Xmx后面的 数字是构建时的分配的内存大小,m是单位MB,建议设置4G以上,也就是4096m+,否则打包的时候可能会失败。

5、某些版本的cocos creator在构建时会将Android studio 根目录的gradle.properties文件的配置修改成构建的默认配置,导致Android studio项目运行失败, 所以构建以后建议看一下这个文件的配置是否被修改。

6、对于cocos3.0.0-3.3.2版本,AndroidBridge文件如果无法直接通过 window["AndroidBridge"] = AndroidBridge.instance将AndroidBridge注册为全局类 那么请在cocos项目的根目录加上文件 "global.d.ts" 这个文件在,sdk的"3.0.0-3.5.2"的目录下面

7、由于不同版本的cocos creator的typescript语法差异,对于不同版本的cocos sdk已做适配,请根据自己的cocos creator自行选择

8、除了开屏广告以外,其他类型的广告都需要先预加载,再播放,否则直接播放无效,预加载只需要执行一次,后续每次播放直接调用对应的广告类型播放就可。

9、对接过程中如果出现了未被提及的问题请联系我们技术处理

导入sdk

1、将下载后的压缩包解压,根据自己的cocos creator版本在不同的文件夹导入对应的sdk

2、cocos creator 3.x的直接在项目中选择导入资源包,再选择对应的压缩包就行导入,如果是cocos creator 2.x ,请将对应的文件夹和文件复制到自己的项目中即可。

3、sdk和demo是分开的,如果需要demo演示,请自行导入。导入方式和2一样。

4、项目导入后选择构建并生成一个Android studio项目。

5、用Android studio打开Android studio项目,在app文件夹下面创建一个名字叫libs的文件夹(如果已有请忽略),并将sdk解压后中的libs压缩包内里面的文件全部复制到libs文件夹中。

6、打开app/AndroidManifest.xml文件,

 将下列内容复制到manifest节点下面 start-end
<manifest 
    .
    .>

    <!--start-->
    
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission
        android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />
    <!--target >=28 需要设置此权限 -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

    <!--必要权限,解决安全风险漏洞,发送和注册广播事件需要调用带有传递权限的接口-->
    <permission
        android:name="${applicationId}.openadsdk.permission.TT_PANGOLIN"
        android:protectionLevel="signature" />
    <uses-permission android:name="${applicationId}.openadsdk.permission.TT_PANGOLIN" />
    
    <!--end-->
    
    .
    .
</manifest>
将下列内容复制到application节点下面 start-end
<application 
    .
    .>
        
        <!--start-->
        <!--穿山甲-->
        <provider
            android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
            android:authorities="${applicationId}.TTMultiProvider"
            android:exported="false" />
        <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/oset_filepath" />
        </provider>

        <!--广点通-->
        <!-- 声明SDK所需要的组件 -->
        <!--配置provider-->
        <provider
            android:name="com.qq.e.comm.GDTFileProvider"
            android:authorities="${applicationId}.gdt.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/oset_filepath" />
        </provider>


        <!--        拼多多-->
        <activity android:name="com.xunmeng.amiibo.view.ULinkLandActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
            
        <!--end-->
    .
    .
</application>

在application下面加上配置 tools:replace="android:allowBackup",如果已有配置tools:replace,请在后面拼接android:allowBackup,","逗号分格
    
<application
 tools:replace="android:allowBackup"
 .
 .
 .
 .
 >
 
</application>

7、打开文件app/build.gradle

在dependencies节点添加下列内容 start-end
dependencies {
    implementation fileTree(dir: '../libs', include: ['*.jar','*.aar'])
    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
    .
    .
    .
    
    // start
    
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.squareup.okhttp3:okhttp:3.12.0'
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    
    // end
}


    在android-defaultConfig节点下面添加配置 multiDexEnabled true (start-end)
    
android{
    .
    .
    defaultConfig {
        .
        .
        multiDexEnabled true
    }
}

8、打开app/proguard-rules.pro文件,将下列内容复制并粘贴到末尾

-ignorewarnings
-keep class com.test.**{*;}
#open_ad_sdk
-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.ss.**{*;}
-dontwarn com.ss.**


#openset start
-keep class com.kc.openset.**{*;}
-dontwarn com.kc.openset.**
#openset end

#oaid start
-keep class com.asus.msa.**{*;}
-keep class com.bun.**{*;}
-keep class com.huawei.hms.ads.identifier.**{*;}
-keep class com.netease.nis.sdkwrapper.**{*;}
-keep class com.samsung.android.deviceidservice.**{*;}
-keep class com.zui.**{*;}
-keep class XI.**{*;}
#oaid end

#快手
-keep class org.chromium.** {*;}
-keep class org.chromium.** { *; }
-keep class aegon.chrome.** { *; }
-keep class com.kwai.**{ *; }
-keep class com.kwad.**{ *; }
-dontwarn com.kwai.**
-dontwarn com.kwad.**
-dontwarn com.ksad.**
-dontwarn aegon.chrome.**
#快手

# WindAd
-keep class com.sigmob.**{*;}
-dontwarn com.sigmob.**

#oaid
-keep class com.bun.supplier.** {*;}
-dontwarn com.bun.supplier.core.**
-keep class XI.**{*;}
-keep class com.bun.miitmdid.**{*;}
#oaid

#广点通 start
-keep class com.qq.e.** {*;}
-dontwarn com.qq.e.**
#广点通 end

#baidu start
-ignorewarnings
-dontwarn com.baidu.mobads.sdk.api.**
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class com.baidu.mobads.** { *; }
-keep class com.style.widget.** {*;}
-keep class com.component.** {*;}
-keep class com.baidu.ad.magic.flute.** {*;}
-keep class com.baidu.mobstat.forbes.** {*;}
#baidu end

#-------------- okhttp3 start-------------
# OkHttp3
# https://github.com/square/okhttp
# okhttp
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.* { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**

# okhttp 3
-keepattributes Signature
-keepattributes *Annotation*
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**

-keepattributes InnerClasses

# Okio
-dontwarn com.squareup.**
-dontwarn okio.**
-keep public class org.codehaus.* { *; }
-keep public class java.nio.* { *; }
#----------okhttp end--------------

# log start
-keep class com.aliyun.sls.android.producer.** { *; }
-keep interface com.aliyun.sls.android.producer.* { *; }
# log end

# 倍孜混淆
-dontwarn com.beizi.fusion.**
-dontwarn com.beizi.ad.**
-keep class com.beizi.fusion.** {*; }
-keep class com.beizi.ad.** {*; }

-keep class com.qq.e.** {
    public protected *;
}

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-dontwarn  org.apache.**

#加固
-keep @com.qihoo.SdkProtected.OSETSDK.Keep class **{*;}
-keep,allowobfuscation interface com.qihoo.SdkProtected.OSETSDK.Keep

##Glide
-dontwarn com.bumptech.glide.**
-keep class com.bumptech.glide.**{*;}
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

#拼多多
-keep class com.xunmeng.** {*;}

9、在Android studio中构建一下项目

10、打开app/src/com.***/AppActivity,在onCreate方法添加 CocosBridgeUtils.getInstance().init(this); start-end

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // DO OTHER INITIALIZATION BELOW
    SDKWrapper.shared().init(this);
    
    // start
    CocosBridgeUtils.getInstance().init(this);
    // end
}

广告对接

以下流程在cocos中进行

初始化

AdSetUtils.instance.initSDK(userId: string, appKey: string, initResultListener: InitResultListener);

//参数说明:
userId:用户在你们平台的唯一id,用于线上日志追述和服务器回调用户定位,没有可传空字符串
appkey:在我们平台申请的媒体id,在后台查看,

InitResultListener {
    initSuccess() {
    //sdk初始化成功
    }
    initError(message: string) {
    //sdk初始化失败
    }
}

预加载激励广告

AdSetUtils.instance.preLoadReward(userId: string, posId: string)
//参数说明:
userId:用户在你们平台的唯一id,用于线上日志追述和服务器回调用户定位,没有可传空字符串
posId:激励视频广告位id

预加插屏广告

AdSetUtils.instance.preLoadInsert(userId: string, posId: string)
//参数说明:
userId:用户在你们平台的唯一id,用于线上日志追述和服务器回调用户定位,没有可传空字符串
posId:插屏广告位id

预加横屏插屏广告

AdSetUtils.instance.preLoadHorizontalInsert(userId: string, posId: string)
//参数说明:
userId:用户在你们平台的唯一id,用于线上日志追述和服务器回调用户定位,没有可传空字符串
posId:横屏插屏广告位id

播放开屏广告

AdSetUtils.instance.showSplash(posId: string, splashListener: SplashListener)
//参数说明:
posId:开屏广告位id
SplashListener {
    onSplashShow(){
        //广告曝光
    }
    onSplashError(errorCode: string, errorMessage: string) {
        //广告播放失败
    }
    onSplashClick(){
        //广告点击
    }
    onSplashClose(){
        //广告关闭
    }
}

播放激励视频广告

AdSetUtils.instance.showReward(userId: string, rewardListener: RewardListener)
//参数说明:
posId:开屏广告位id
RewardListener {
    onRewardShow(key: string){
        // 广告曝光,
        // key:广告唯一id
    }
    onRewardClick() {
        // 广告点击
    }
    onRewardClose(key: string){
        // 广告关闭
        // key:广告唯一id
    }
    onRewardVideoEnd(key: string){
        // 视频播放结束
        // key:广告唯一id
    }
    onRewardVideoStart(){
        //视频开始播放
    }
    onRewardVerify(key: string, arg: number){
        //激励视频广告产生了收益,在这里给用户下发奖励
        // key:广告唯一id
    }
    onServiceResponse(code: number){ 0失败,1成功
        //服务器回调使用,服务器回调调用你们接口响应结果,0代表https200。
    }
    onRewardError(errorCode: string, errorMessage: string){
        //广告播放错误
    }
}

播放插屏广告

AdSetUtils.instance.showInsert(insertListener: InsertListener)
//参数说明:
posId:开屏广告位id
InsertListener {
    onInsertShow() {
        // 广告曝光
    }
    onInsertClick() {
        // 广告点击
    }
    onInsertClose() {
        // 广告关闭
    }
    onInsertError(errorCode: string, errorMessage: string) {
        // 广告播放失败
    }
}

播放插屏横屏广告

AdSetUtils.instance.showHorizontalInsert(horizontalInsertListener: HorizontalInsertListener)
//参数说明:
posId:开屏广告位id
HorizontalInsertListener {
    onHorizontalInsertShow() {
        // 广告曝光
    }
    onHorizontalInsertClick() {
        // 广告点击
    }
    onHorizontalInsertClose() {
        // 广告关闭
    }
    onHorizontalInsertError(errorCode: string, errorMessage: string) {
        // 广告播放失败
    }
}
Last Updated:
Contributors: zhaochangchang