关于COCOS Creator3.8.2 接入穿山甲SDK解决方案

build.gradle 文件 Project

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
        //mintegral sdk依赖   引入mintegral sdk需要添加此maven
        maven {
            url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_support/"
        }
        maven {
            url "https://artifact.bytedance.com/repository/pangle"
        }
        google()
        mavenCentral()
        // jcenter() // keeped as anchor, will be removed soon
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:8.0.2'
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
    allprojects {
        repositories {
            //mintegral sdk依赖   引入mintegral sdk需要添加此maven
            maven {
                url "https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_support/"
            }
            maven {
                url "https://artifact.bytedance.com/repository/pangle"
            }
            google()

        }
    }
}

apply from: NATIVE_DIR +"/build.gradle"

build.gradle 文件 Module

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

RES_PATH = RES_PATH.replace("\\", "/")
COCOS_ENGINE_PATH = COCOS_ENGINE_PATH.replace("\\", "/")

buildDir = "${RES_PATH}/proj/build/${project.name ==~ /^[_a-zA-Z0-9-]+$/ ? project.name : 'CocosGame'}"
android {
    compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
    buildToolsVersion PROP_BUILD_TOOLS_VERSION
    ndkPath PROP_NDK_PATH
    namespace APPLICATION_ID

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        applicationId APPLICATION_ID
        minSdkVersion PROP_MIN_SDK_VERSION
        targetSdkVersion PROP_TARGET_SDK_VERSION
        versionCode 1
        versionName "1.0"

        externalNativeBuild {
            cmake {
                targets "cocos"
                arguments "-DRES_DIR=${RES_PATH}", "-DANDROID_STL=c++_static", "-DANDROID_TOOLCHAIN=clang", "-DANDROID_ARM_NEON=TRUE"
            }
            ndk { abiFilters PROP_APP_ABI.split(':') }
        }
    }

    sourceSets.main {
        java.srcDirs "../src", "src"
        res.srcDirs "../res", 'res', "${RES_PATH}/proj/res"
        jniLibs.srcDirs "../libs", 'libs'
        manifest.srcFile "AndroidManifest.xml"
        assets.srcDir "${RES_PATH}/data"
        jniLibs {
            // Vulkan validation layer
            // srcDir "${android.ndkDirectory}/sources/third_party/vulkan/src/build-android/jniLibs"
        }
    }

    externalNativeBuild {
        cmake {
            version "3.22.1"
            path "../CMakeLists.txt"
            buildStagingDirectory "${RES_PATH}/proj/build"
        }
    }

    signingConfigs {

       release {
            if (project.hasProperty("RELEASE_STORE_FILE") && !RELEASE_STORE_FILE.isEmpty()) {
                storeFile file(RELEASE_STORE_FILE)
                storePassword RELEASE_STORE_PASSWORD
                keyAlias RELEASE_KEY_ALIAS
                keyPassword RELEASE_KEY_PASSWORD
            }
        }
    }

    buildTypes {
        release {
            debuggable false
            jniDebuggable false
            renderscriptDebuggable false
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            if (project.hasProperty("RELEASE_STORE_FILE")) {
                signingConfig signingConfigs.release
            }
                        
            externalNativeBuild {
                cmake {
                    // switch HIDE_SYMBOLS to OFF to skip compilation flag `-fvisibility=hidden`
                    arguments "-DHIDE_SYMBOLS=ON"
                }
            }

            if (!Boolean.parseBoolean(PROP_IS_DEBUG)) {
                getIsDefault().set(true)
            }

        }

        debug {
            debuggable true
            jniDebuggable true
            renderscriptDebuggable true
            // resValue  "string", "app_name", "${PROP_APP_NAME}-dbg"
            // applicationIdSuffix ".debug"
        }
    }
}

dependencies {
    implementation fileTree(dir: '../libs', include: ['*.jar','*.aar'])
    implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
    implementation fileTree(dir: "${COCOS_ENGINE_PATH}/cocos/platform/android/java/libs", include: ['*.jar'])
    implementation project(':libservice')
    implementation project(':libcocos')
    api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.28'
    // https://mvnrepository.com/artifact/com.android.support/appcompat-v7
    implementation 'com.android.support:appcompat-v7:28.0.0'


    if (Boolean.parseBoolean(PROP_ENABLE_INPUTSDK)) {
        implementation 'com.google.android.libraries.play.games:inputmapping:1.1.0-beta'
        implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.10"
    }
}

穿山甲配置类  

TTAdManagerHolder
package hechengmao.uni.csjConfig;

import android.content.Context;

import com.bytedance.sdk.openadsdk.TTAdConfig;
import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.bytedance.sdk.openadsdk.TTCustomController;
import com.bytedance.sdk.openadsdk.mediation.init.MediationPrivacyConfig;

public class TTAdManagerHolder {

    // 公共方法,封装了对私有方法的调用
    public void initialize(Context context) {
        initMediationAdSdk(context);
        // 可以添加其他初始化逻辑或检查
    }
    //初始化聚合sdk
    private void initMediationAdSdk(Context context) {
        TTAdSdk.init(context, buildConfig(context));
        TTAdSdk.start(new TTAdSdk.Callback() {
            @Override
            public void success() {
                System.out.println("初始化成功");
                //初始化成功
                //在初始化成功回调之后进行广告加载
            }

            @Override
            public void fail(int i, String s) {
                //初始化失败
                System.out.println("初始化失败");
            }
        });
    }

    // 构造TTAdConfig
    private TTAdConfig buildConfig(Context context) {
        return new TTAdConfig.Builder()
                .appId("5512562") //APP ID
                .appName("欢乐消消") //APP Name
                .useMediation(true)  //开启聚合功能
                .customController(getTTCustomController())  //设置隐私权
                .build();
    }
    //设置隐私合规
    private TTCustomController getTTCustomController() {
        return new TTCustomController() {
            @Override
            public boolean isCanUseLocation() {  //是否授权位置权限
                return true;
            }

            @Override
            public boolean isCanUsePhoneState() {  //是否授权手机信息权限
                return true;
            }

            @Override
            public boolean isCanUseWifiState() {  //是否授权wifi state权限
                return true;
            }

            @Override
            public boolean isCanUseWriteExternal() {  //是否授权写外部存储权限
                return true;
            }

            @Override
            public boolean isCanUseAndroidId() {  //是否授权Android Id权限
                return true;
            }

            @Override
            public MediationPrivacyConfig getMediationPrivacyConfig() {
                return new MediationPrivacyConfig() {
                    @Override
                    public boolean isLimitPersonalAds() {  //是否限制个性化广告
                        return true;
                    }

                    @Override
                    public boolean isProgrammaticRecommend() {  //是否开启程序化广告推荐
                        return true;
                    }
                };
            }
        };
    }

}
AppActivity 类
/****************************************************************************
Copyright (c) 2015-2016 Chukong Technologies Inc.
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.

http://www.cocos2d-x.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package hechengmao.uni;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.content.res.Configuration;

import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdConstant;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.bytedance.sdk.openadsdk.TTRewardVideoAd;
import com.bytedance.sdk.openadsdk.mediation.manager.MediationAdEcpmInfo;
import com.bytedance.sdk.openadsdk.mediation.manager.MediationBaseManager;
import com.cocos.service.SDKWrapper;
import com.cocos.lib.CocosActivity;
import hechengmao.uni.csjConfig.TTAdManagerHolder;

public class AppActivity extends CocosActivity {

    static public AppActivity activity;
    private TTAdNative mTTAdNative;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // DO OTHER INITIALIZATION BELOW
        //穿山甲注入
        TTAdManagerHolder ttAdManagerHolder = new TTAdManagerHolder();
        ttAdManagerHolder.initialize(this);
        activity = this;
        SDKWrapper.shared().init(this);

    }


    //构造激励视频广告的Adlsot
    private AdSlot buildRewardAdlost(){
        return new AdSlot.Builder()
                .setCodeId("102737500")  //广告位ID
                .setOrientation(TTAdConstant.VERTICAL)  //激励视频方向
                .build();
    }

    //前端调用JAVA代码
    static public void ShowAd(){
        activity.loadRewardAd();
    }



    //加载激励视频
    private void loadRewardAd() {
        TTAdNative adNativeLoader = TTAdSdk.getAdManager().createAdNative(activity);
        mTTAdNative = adNativeLoader;
        /** 这里为激励视频的简单功能,如需使用复杂功能,如gromore的服务端奖励验证,请参考demo中的AdUtils.kt类中激励部分 */
        adNativeLoader.loadRewardVideoAd(buildRewardAdlost(), new TTAdNative.RewardVideoAdListener() {
            @Override
            public void onError(int errorCode, String errorMsg) {
                //广告加载失败
            }

            @Override
            public void onRewardVideoAdLoad(TTRewardVideoAd ttRewardVideoAd) {
                //广告加载失败
            }

            @Override
            public void onRewardVideoCached() {
                //广告缓存成功 此api已经废弃,请使用onRewardVideoCached(TTRewardVideoAd ttRewardVideoAd)
            }

            @Override
            public void onRewardVideoCached(TTRewardVideoAd ttRewardVideoAd) {
                //广告缓存成功 在此回调中进行广告展示
                showRewardAd(activity, ttRewardVideoAd);
            }
        });
    }


    //展示激励视频
    private void showRewardAd(Activity act, TTRewardVideoAd ttRewardVideoAd) {
        if (act == null || ttRewardVideoAd == null) {
            return;
        }

        ttRewardVideoAd.setRewardAdInteractionListener(new TTRewardVideoAd.RewardAdInteractionListener() {
            @Override
            public void onAdShow() {
                //广告展示
                //获取展示广告相关信息,需要再show回调之后进行获取
                MediationBaseManager manager = ttRewardVideoAd.getMediationManager();
                if (manager != null && manager.getShowEcpm() != null) {
                    MediationAdEcpmInfo showEcpm = manager.getShowEcpm();
                    String ecpm = showEcpm.getEcpm(); //展示广告的价格
                    String sdkName = showEcpm.getSdkName();  //展示广告的adn名称
                    String slotId = showEcpm.getSlotId(); //展示广告的代码位ID

                    System.out.println(ecpm);
                    System.out.println(sdkName);
                    System.out.println(slotId);

                }
            }

            @Override
            public void onAdVideoBarClick() {
                //广告点击
            }

            @Override
            public void onAdClose() {
                //广告关闭
            }

            @Override
            public void onVideoComplete() {
                //广告视频播放完成
            }

            @Override
            public void onVideoError() {
                //广告视频错误
            }

            @Override
            public void onRewardVerify(boolean rewardVerify, int rewardAmount, String rewardName, int errorCode, String errorMsg) {
                //奖励发放 已废弃 请使用 onRewardArrived 替代
            }

            @Override
            public void onRewardArrived(boolean isRewardValid, int rewardType, Bundle extraInfo) {
                //奖励发放
                if (isRewardValid) {
                    // 验证通过
                    // 从extraInfo读取奖励信息
                } else {
                    // 未验证通过
                }
            }

            @Override
            public void onSkippedVideo() {
                //广告跳过
            }
        });
        ttRewardVideoAd.showRewardVideoAd(act); //展示激励视频
    }




    @Override
    protected void onResume() {
        super.onResume();
        SDKWrapper.shared().onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        SDKWrapper.shared().onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
        if (!isTaskRoot()) {
            return;
        }
        SDKWrapper.shared().onDestroy();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        SDKWrapper.shared().onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        SDKWrapper.shared().onNewIntent(intent);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        SDKWrapper.shared().onRestart();
    }

    @Override
    protected void onStop() {
        super.onStop();
        SDKWrapper.shared().onStop();
    }

    @Override
    public void onBackPressed() {
        SDKWrapper.shared().onBackPressed();
        super.onBackPressed();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        SDKWrapper.shared().onConfigurationChanged(newConfig);
        super.onConfigurationChanged(newConfig);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        SDKWrapper.shared().onRestoreInstanceState(savedInstanceState);
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        SDKWrapper.shared().onSaveInstanceState(outState);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onStart() {
        SDKWrapper.shared().onStart();
        super.onStart();
    }

    @Override
    public void onLowMemory() {
        SDKWrapper.shared().onLowMemory();
        super.onLowMemory();
    }
}

AndroidManifest.xml  根据官方文档进行配置权限

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
  <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  <application android:extractNativeLibs="true" android:allowBackup="true" android:label="@string/app_name" android:usesCleartextTraffic="true" android:icon="@mipmap/ic_launcher" android:resizeableActivity="true">
    <meta-data android:name="android.app.lib_name" android:value="cocos"/>
    <activity android:name="hechengmao.uni.AppActivity" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden|screenSize|screenLayout|smallestScreenSize" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:launchMode="singleTask" android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
    <activity android:name="com.cocos.lib.CocosEditBoxActivity" android:configChanges="orientation|keyboardHidden|screenSize|screenLayout|smallestScreenSize" android:screenOrientation="behind" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
    <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/pangle_file_paths"/>
    </provider>
    <provider android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider" android:authorities="${applicationId}.TTMultiProvider" android:exported="false"/>
  </application>
</manifest>

注意事项:  build.gradle 文件 Module  中配置这个 要不然会报错 androidX 以下是这样配置

implementation 'com.android.support:appcompat-v7:28.0.0'
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 穿山甲是指在 Unity 引擎中接入穿山甲广告SDK的过程。穿山甲广告SDK是一种用于在应用程序中展示广告的工具。根据引用,您可以在给定的博客文章中找到 Unity 接入穿山甲广告SDK的示例源代码。同时,引用提供了穿山甲官方网站上的SDK下载链接。 然而,您提到在导入穿山甲SDK后,在打包APK时遇到了一个错误。根据引用,这个错误可能是因为您的mainTemplate.gradle文件使用了旧版的aaptOptions noCompress属性定义,而未包括unityStreamingAssets常量定义的类型。为了解决这个错误,您可以尝试更新mainTemplate.gradle文件中的aaptOptions noCompress属性定义,以包括unityStreamingAssets常量定义的类型。这样可以确保在打包APK时正确处理Unity Streaming Assets。 总结起来,Unity 穿山甲是指在 Unity 引擎中接入穿山甲广告SDK的过程。您可以通过引用中的示例源代码和引用中的官方SDK下载链接来完成接入。同时,如果在导入SDK后遇到错误,您可以参考引用中提供的解决方案来处理该错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [unity接入穿山甲广告SDK示例Demo源码 V4.1.0.2](https://download.csdn.net/download/gaoliang0/71924016)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Unity接入穿山甲广告SDK(以及GroMoreDemo)](https://blog.csdn.net/gaoliang0/article/details/121544454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [unity穿山甲SDK打包问题](https://blog.csdn.net/qinooo/article/details/120504478)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值