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'