cocos 版本 3.8.2
一、使用cocos构建安卓平台项目
cocos编辑器菜单-项目-构建发布-选择安卓平台-构建
二、集成相关SDK
1、使用Android studio打开项目,将视图更换为project
2、打开项目根目录\app\build.gradle,在dependencies{}块中添加以下代码
dependencies {
// 其他代码
...
// 添加以下代码
implementation 'com.taptap.sdk:tap-core:4.5.4'
implementation 'com.taptap.sdk:tap-kit:4.5.4'
implementation 'com.taptap.sdk:tap-login:4.5.4'
implementation 'com.taptap.sdk:tap-compliance:4.5.4'
// 继续添加TapSDK相关的强制依赖
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1'
}
3、如果targetSdkVersion < 29,打开项目根目录\app\AndroidManifest.xml,在manifest中添加xmlns:tools="http://schemas.android.com/tools",在application中添加tools:remove="android:requestLegacyExternalStorage"
4、打开项目根目录\app\proguard-rules,添加相关代码跳过对 TapSDK 的混淆
# ========== TapSDK 核心保留规则(必选) ==========
# 保留 TapTap SDK 相关的类,防止 R8 移除
-keep class com.taptap.sdk.** { *; }
-keep class com.taptap.sdk.compliance.api.** { *; }
-keep class com.taptap.sdk.core.** { *; }
-keep class com.taptap.sdk.login.** { *; }
-keep class com.taptap.sdk.servicemanager.** { *; }
# ========== 其他相关的保留规则(可选) ==========
# 防止移除 Kotlin 相关的序列化类
-keep class kotlinx.serialization.** { *; }
# 解决 `Companion` 类丢失的问题
-keepclassmembers class * {
public static final kotlin.jvm.internal.DefaultConstructorMarker Companion;
}
# 防止混淆 Kotlin `Companion` 对象
-keepnames class *$Companion
# 处理 R8 的代码优化
-dontwarn com.taptap.sdk.**
-dontwarn kotlinx.serialization.**
# 保留 Kotlin 协程相关类,防止 R8 移除
-keep class kotlinx.coroutines.** { *; }
-keepclassmembers class kotlinx.coroutines.** { *; }
-dontwarn kotlinx.coroutines.**
5、打开项目根目录\app\src\你的游戏包名\AppActivity.java,添加相关代码
package com.cocos.game; // 确认这个包名无误,在cocos打包时包名是什么就填什么
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Map;
import com.cocos.lib.CocosHelper;
import com.cocos.lib.CocosJavascriptJavaBridge;
import com.taptap.sdk.core.TapTapRegion;
import com.taptap.sdk.core.TapTapSdk;
import com.taptap.sdk.core.TapTapSdkOptions;
import com.taptap.sdk.kit.internal.callback.TapTapCallback;
import com.taptap.sdk.kit.internal.exception.TapTapException;
import com.taptap.sdk.login.Scopes;
import com.taptap.sdk.compliance.TapTapCompliance;
import com.taptap.sdk.login.TapTapAccount;
import com.taptap.sdk.login.TapTapLogin;
import com.taptap.sdk.compliance.TapTapComplianceCallback;
import com.taptap.sdk.compliance.constants.ComplianceMessage;
public class AppActivity extends CocosActivity {
// 在onCreate里赋值实例用
private static AppActivity instance;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this; // 赋值实例
// 初始化 TapTap SDK
initTapTapSdk();
// 注册TapTap防沉迷回调
TapTapCompliance.registerComplianceCallback(new TapTapComplianceCallback() {
@Override
public void onComplianceResult(int code, @Nullable Map<String, ?> extra) {
Log.d("TapTapCompliance", "认证结果 Code: " + code);
switch (code) {
case ComplianceMessage.LOGIN_SUCCESS:
Log.d("TapTapCompliance", "认证成功,允许进入游戏");
callCocosLoginSuccess(); // 通知 Cocos 端登录成功
break;
case ComplianceMessage.EXITED:
Log.d("TapTapCompliance", "用户退出认证");
break;
case ComplianceMessage.SWITCH_ACCOUNT:
Log.d("TapTapCompliance", "切换账号");
break;
case ComplianceMessage.PERIOD_RESTRICT:
Log.d("TapTapCompliance", "未成年人时间限制");
break;
case ComplianceMessage.DURATION_LIMIT:
Log.d("TapTapCompliance", "游戏时间已用完");
break;
case ComplianceMessage.INVALID_CLIENT_OR_NETWORK_ERROR:
Log.d("TapTapCompliance", "客户端或网络错误");
break;
default:
Log.d("TapTapCompliance", "未知认证结果");
break;
}
}
});
}
// 初始化 TapTap SDK 方法
private void initTapTapSdk() {
String clientId = "你的 Client ID"; // 在Tap后台获取
String clientToken = "你的 Client Token"; // 在Tap后台获取
// 是否开启 log,Debug 开启,Release 关闭
boolean enableLog = BuildConfig.DEBUG;
TapTapSdkOptions tapSdkOptions = new TapTapSdkOptions(
clientId, // 游戏 Client ID
clientToken, // 游戏 Client Token
TapTapRegion.CN // 游戏区域
);
Log.d("TapTapLogin", "TapTap SDK 初始化成功!");
TapTapSdk.init(this, tapSdkOptions);
}
// 登录TapTap账号方法,这个方法需要在cocos那边做一个按钮,把这个方法绑定到那个按钮上
public static AppActivity getInstance() {
return instance;
}
public static void tapTapLogin() {
Log.d("TapTapLogin", "开始 TapTap 登录...");
AppActivity activity = getInstance(); // 获取实例
if (activity == null) {
Log.e("TapTapLogin", "AppActivity 实例为空,无法进行登录");
return;
}
// 定义授权范围
String[] scopes = new String[]{Scopes.SCOPE_PUBLIC_PROFILE, Scopes.SCOPE_BASIC_INFO};
// 执行 TapTap 登录
TapTapLogin.loginWithScopes(activity, scopes, new TapTapCallback<TapTapAccount>() {
@Override
public void onSuccess(TapTapAccount tapTapAccount) {
String openId = tapTapAccount.getOpenId();
Log.d("TapTapLogin", "登录成功:" + openId);
// 启动 TapTap 防沉迷认证
String unionId = tapTapAccount.getUnionId();
if (unionId.trim().isEmpty()) {
Log.e("TapTapLogin", "unionId 为空,无法启动防沉迷认证");
} else {
TapTapCompliance.startup(activity, unionId);
}
}
@Override
public void onFail(@NonNull TapTapException exception) {
Log.e("TapTapLogin", "登录失败:" + exception.getMessage());
}
@Override
public void onCancel() {
Log.d("TapTapLogin", "用户取消登录");
}
});
}
// 通知 Cocos 端登录成功(这里我的游戏不需要传参给cocos端,需要传参的可以自己加上)
private static void callCocosLoginSuccess() {
CocosHelper.runOnGameThread(() -> {
try {
CocosJavascriptJavaBridge.evalString("window.onTapTapLoginSuccess && window.onTapTapLoginSuccess()");
} catch (Exception e) {
Log.e("CocosBridge", "evalString 执行失败", e);
}
});
}
// ✅ 退出认证
public static void exitTapTapCompliance() {
TapTapCompliance.exit();
}
}
6、打开cocos端,在你的相关脚本上添加调用代码和回调代码
// 先定义一个回调函数,用于处理登录成功的逻辑
declare global {
interface Window {
onTapTapLoginSuccess: () => void;
}
}
export class LoginPage extends Component {
onLoad() {
// 绑定全局登录成功回调
window.onTapTapLoginSuccess = this.onTapTapLoginSuccess.bind(this);
}
// TapTap登录 (这个方法绑定到登录按钮上,用于调用AppActivity.java里的tapTapLogin)
onTapLogin() {
console.log("开始调用 Android TapTap 登录...");
(globalThis as any).jsb.reflection.callStaticMethod(
"com/cocos/game/AppActivity", // Java 类路径,注意要填写你项目的实际路径
"tapTapLogin", // AppActivity.java里的方法名
"()V"
);
}
// 登录成功且java那边回调为500时,调用onTapTapLoginSuccess显示进入游戏界面
onTapTapLoginSuccess() {
// 这里写你的登录成功逻辑,我的游戏主要就是一些UI显示
this.background.node.active = true;
this.nicknameInput.node.active = true;
this.loginButton.node.active = true;
this.TapLoginButton.node.active = false;
}
}
7、后面就是构建、打包、测试,在tap后台-游戏服务-合规认证,可以申请各种条件下的测试账号