Cocos接入九游 SDK
By LayFz on Aug 27, 2024
Android接入九游 SDK
本文档提供了如何在 Android 项目中接入九游 SDK 的详细步骤。九游 SDK 是一个为游戏开发者提供各种功能的工具包,如广告、分析、用户认证等。
准备工作
-
创建九游账号:
- 访问 九游开发者平台 注册并登录账户。
-
下载九游 SDK:
- 登录开发者平台,下载最新版本的九游 SDK。
以上是SDK9.7.8.0_7.7.1.0版本的sdk文件夹。我们需要的是demo包 ,具体路径在这个位置👇

- 登录开发者平台,下载最新版本的九游 SDK。
-
准备应用信息:
- 获取你的应用包名、应用密钥等必要的信息,这些信息在九游开发者平台上会提供。
- 主要是获取gameId,这是需要初始化的
集成 SDK
1. 将九游 SDK 添加到项目中
-
添加 SDK 依赖:
- 将九游 SDK 的
.aar文件添加到项目的aar目录下。如果没有aar目录,可以手动创建一个。

- 将九游 SDK 的
-
配置 Gradle:
-
在
app模块的build.gradle文件中,添加对九游 SDK 的依赖:dependencies { implementation fileTree(dir: 'aar', include: ['*.jar','*.aar']) }
-
2. 修改 AndroidManifest.xml
-
添加权限和服务:
- 打开
AndroidManifest.xml文件,添加九游 SDK 所需的权限和服务:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <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_PHONE_STATE" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />以上是权限部分,依次添加activity部分:
<!-- android:taskAffinity 填上游戏的包名,如游戏包名为cn.uc.gamesdk.demo,则下面填 cn.uc.gamesdk.demo.diff --> <!-- data android:scheme 里填上”ng+当前游戏的gameId”,如游戏ID是123456,则填上ng123456 --> <activity tools:replace="android:taskAffinity" android:name="cn.uc.gamesdk.activity.PullupActivity" android:theme="@android:style/Theme.Translucent" android:taskAffinity="com.example.app.diff" android:excludeFromRecents="true" android:label="PullupActivity" android:launchMode="singleTop" android:exported="true" tools:node="replace"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="ng132465" /> </intent-filter> </activity> <activity android:name="cn.gundam.sdk.shell.activity.ThemeProxyActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar" android:windowSoftInputMode="adjustResize" > <intent-filter> <action android:name="cn.uc.gamesdk.sdkweb" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <!-- sdk service 1.1.3新增 --> <service android:name="cn.gundam.sdk.shell.service.ProxyService" android:process=":bgservice" android:exported="false" tools:replace="android:exported"/> <!-- sdk service end--> <!-- 以上声明是SDK内部声明,最好不要更改,直接拷贝过去 --> - 打开
-
处理 Manifest 合并冲突:
-
如果在集成过程中出现 Manifest 合并冲突,可以通过
tools:replace来解决。例如:<application android:allowBackup="true" tools:replace="android:allowBackup"> <!-- 其他配置 --> </application> -
确保在
AndroidManifest.xml文件的开头添加了xmlns:tools="http://schemas.android.com/tools"以支持tools命名空间。 以上部分添加到位,基本就完成了引入,附几张图注意要修改的部分:

-
3. 初始化九游 SDK
-
在
AppActivity类中初始化:-
在你的
AppActivity类中初始化九游 SDK:import cn.gundam.sdk.shell.even.SDKEventKey; import cn.gundam.sdk.shell.even.SDKEventReceiver; import cn.gundam.sdk.shell.even.Subscribe; import cn.gundam.sdk.shell.exception.AliLackActivityException; import cn.gundam.sdk.shell.open.ParamInfo; import cn.gundam.sdk.shell.open.UCOrientation; import cn.gundam.sdk.shell.param.SDKParamKey; import cn.gundam.sdk.shell.param.SDKParams; import cn.uc.gamesdk.UCGameSdk; public class AppActivity extends Cocos2dxActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // DO OTHER INITIALIZATION BELOW SDKWrapper.getInstance().init(this); UCGameSdk.defaultSdk().registerSDKEventReceiver(receiver); ucSdkInit(); } } private void ucSdkInit() { ParamInfo gameParamInfo = new ParamInfo(); gameParamInfo.setGameId(YOUR_GAME_ID); gameParamInfo.setOrientation(UCOrientation.PORTRAIT); SDKParams sdkParams = new SDKParams(); sdkParams.put(SDKParamKey.GAME_PARAMS, gameParamInfo); // 如果游戏已经申请了权限,不想sdk主动请求权限,要通过SDKParamKey.GAME_HAD_REQUEST_PERMISSION参数告知九游sdk // true 游戏已经弹了,SDK不需要弹出权限申请窗 // false 游戏没有弹,SDK可以按需弹出权限申请窗 sdkParams.put(SDKParamKey.GAME_HAD_REQUEST_PERMISSION, false); try { //初始化SDK UCGameSdk.defaultSdk().initSdk(this, sdkParams); } catch (AliLackActivityException e) { e.printStackTrace(); } } /** * 退出游戏前,请调用本方法 * @param view */ public void exit(View view) { try { UCGameSdk.defaultSdk().exit(this, null); } catch (Exception e) { e.printStackTrace(); exitApp(); } } private void exitApp() { finish(); //退出程序 Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); android.os.Process.killProcess(android.os.Process.myPid()); } /** *回调事件 */ private SDKEventReceiver receiver = new SDKEventReceiver() { @Subscribe(event = SDKEventKey.ON_EXIT_SUCC) private void onExit(String desc) { Log.d(TAG, "ON_EXIT_SUCC"); //Toast.makeText(MainActivity.this, ">> 游戏即将退出", Toast.LENGTH_LONG).show(); exitApp(); } @Subscribe(event = SDKEventKey.ON_EXIT_CANCELED) private void onExitCanceled(String desc) { runOnUiThread(new Runnable() { @Override public void run() { //Toast.makeText(MainActivity.this, ">> 继续游戏", Toast.LENGTH_LONG).show(); } }); } // @Subscribe(event = SDKEventKey.ON_LOGIN_SUCC) // private void onLoginSucc(final String sid) { // runOnUiThread(new Runnable() { // // @Override // public void run() { // if (TextUtils.isEmpty(sid)) { // // 离线试玩 // Toast.makeText(AppActivity.this, ">> 离线登录成功", Toast.LENGTH_LONG).show(); // } else { // // 用户登录 // Toast.makeText(AppActivity.this, ">> 用户登录成功", Toast.LENGTH_LONG).show(); // } // } // }); // // } // @Subscribe(event = SDKEventKey.ON_LOGIN_FAILED) // private void onLoginFailed(String desc) { // runOnUiThread(new Runnable() { // // @Override // public void run() { // Toast.makeText(AppActivity.this, ">> 登录失败", Toast.LENGTH_LONG).show(); // } // }); // } @Subscribe(event = SDKEventKey.ON_INIT_SUCC) private void onInitSucc() { runOnUiThread(new Runnable() { @Override public void run() { // Toast.makeText(AppActivity.this, ">> 初始化成功", Toast.LENGTH_LONG).show(); } }); } @Subscribe(event = SDKEventKey.ON_INIT_FAILED) private void onInitFailed(String msg) { runOnUiThread(new Runnable() { @Override public void run() { // Toast.makeText(AppActivity.this, ">> 初始化失败", Toast.LENGTH_LONG).show(); } }); } // @Subscribe(event = SDKEventKey.ON_CREATE_ORDER_SUCC) // private void onPaySucc(final Bundle data) { // runOnUiThread(new Runnable() { // // @Override // public void run() { // Toast.makeText(MainActivity.this, ">> 支付成功", Toast.LENGTH_LONG).show(); // Log.d(TAG, "此处为支付成功回调: callback data = " + data.getString("response")); // } // }); // String response = data.getString("response"); // // 这里执行发货,如果发货成功需要设置以下值 // data.putString("result", Response.OPERATE_SUCCESS_MSG); // // 如果发货失败需要设置以下值 // //data.putString("result", Response.OPERATE_FAIL_MSG); // Log.d(TAG, "pay succ" + data); // } // // @Subscribe(event = SDKEventKey.ON_PAY_USER_EXIT) // private void onPayFail(String data) { // runOnUiThread( new Runnable() { // // @Override // public void run() { // Toast.makeText(MainActivity.this, ">> 支付失败", Toast.LENGTH_LONG).show(); // } // }); // Log.d(TAG, "pay exit"); // } // SDK侧发起的账号切换请求 // 步骤1,侦听SDK切换账号指令 // @Subscribe(event = SDKEventKey.ON_ACCOUNT_SWITCH_REQUEST) // private void onAccountSwitchRequest(final String sid) { // Toast.makeText(MainActivity.this, "侦听到ON_ACCOUNT_SWITCH_REQUEST指令", Toast.LENGTH_SHORT).show(); // //步骤2,CP接入组先退出当前游戏角色 // logoutGameRole(); // //步骤3,和正常登录一样,调用sdk做登录请求 // //这里需要注意: // // 1. 如果游戏的退出和重新登录在native层是异步的, // // 那requestLogin()应该由cp自行决定在合适的节点调用, // // 不要求必须放在onAccountSwitchRequest()方法中; // // 2. requestLogin()只需要保证在角色已退出的情况下调用即可; // login(); // } }; -
注意将代码中的
YOUR_GAME_ID替换为从九游开发者平台获取的实际值。
-
配置项目
-
配置 ProGuard:
- 如果你的项目使用 ProGuard 混淆代码,确保在
proguard-rules.pro文件中添加以下规则以防止混淆:
-dontwarn -ignorewarnings #------------------------- 联运 start --------------------------------- -dontskipnonpubliclibraryclassmembers -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod -keep public class * extends cn.gundam.sdk.shell.even.SDKEventReceiver -keep class android.**{ <methods>; <fields>; } -keep class cn.uc.**{ <methods>; <fields>; } -keep class cn.gundam.**{ <methods>; <fields>; } #------------------------- 联运 end --------------------------------- - 如果你的项目使用 ProGuard 混淆代码,确保在
测试和调试
-
运行应用:
- 启动你的应用并验证九游 SDK 是否正常工作。检查 SDK 的日志输出以确认初始化是否成功。
-
查看日志:
- 使用 Logcat 查看九游 SDK 的调试信息,确保没有出现错误或警告。
-
进行功能测试:
- 测试九游 SDK 提供的各种功能(如广告展示、用户登录等),确保它们在应用中正常工作。
常见问题
-
Manifest 合并冲突:
- 如果遇到 Manifest 合并冲突,请参阅 处理 Manifest 合并冲突 文档以获取更多信息。
-
SDK 初始化失败:
- 确保应用 ID 和密钥正确无误,并且网络连接正常。
-
日志查看:
- 使用 Logcat 查看 SDK 的调试信息,帮助排查问题。