Cocos接入九游 SDK

By LayFz on Aug 27, 2024

Android接入九游 SDK

本文档提供了如何在 Android 项目中接入九游 SDK 的详细步骤。九游 SDK 是一个为游戏开发者提供各种功能的工具包,如广告、分析、用户认证等。

准备工作

  1. 创建九游账号:

  2. 下载九游 SDK:

    • 登录开发者平台,下载最新版本的九游 SDK。 以上是SDK9.7.8.0_7.7.1.0版本的sdk文件夹。我们需要的是demo包 ,具体路径在这个位置👇
  3. 准备应用信息:

    • 获取你的应用包名、应用密钥等必要的信息,这些信息在九游开发者平台上会提供。
    • 主要是获取gameId,这是需要初始化的

集成 SDK

1. 将九游 SDK 添加到项目中

  1. 添加 SDK 依赖:

    • 将九游 SDK 的 .aar 文件添加到项目的 aar 目录下。如果没有 aar 目录,可以手动创建一个。
  2. 配置 Gradle:

    • app 模块的 build.gradle 文件中,添加对九游 SDK 的依赖:

      dependencies {
         implementation fileTree(dir: 'aar', include: ['*.jar','*.aar'])
      }

2. 修改 AndroidManifest.xml

  1. 添加权限和服务:

    • 打开 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内部声明,最好不要更改,直接拷贝过去 -->
  2. 处理 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

  1. 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 替换为从九游开发者平台获取的实际值。

配置项目

  1. 配置 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 ---------------------------------

测试和调试

  1. 运行应用:

    • 启动你的应用并验证九游 SDK 是否正常工作。检查 SDK 的日志输出以确认初始化是否成功。
  2. 查看日志:

    • 使用 Logcat 查看九游 SDK 的调试信息,确保没有出现错误或警告。
  3. 进行功能测试:

    • 测试九游 SDK 提供的各种功能(如广告展示、用户登录等),确保它们在应用中正常工作。

常见问题

  1. Manifest 合并冲突:

  2. SDK 初始化失败:

    • 确保应用 ID 和密钥正确无误,并且网络连接正常。
  3. 日志查看:

    • 使用 Logcat 查看 SDK 的调试信息,帮助排查问题。

参考资料

评论

订阅我的博客

通过RSS订阅获取最新文章更新,不错过任何一篇技术分享

推荐使用 FeedlyInoreader 等RSS阅读器订阅