当前位置:   article > 正文

[Unity]腾讯SDK踩坑之路(4)--GCloud+GVoice坑_腾讯gcloud

腾讯gcloud

        为啥要接GCloud呢?因为我们项目采用的方式有问题,这是腾讯专家说的,然后只能改了。先说下我们这边的方式,客户端是请求PHP后台生成的一个txt文件(Json格式的),然后获取CDN和区服相关信息,根据参数是否显示审核服还是正式服,接着再去请求一堆区服数据的txt。如果在选服界面的话,还需要每隔5秒或者10秒重新请求,判断是否有新的服务器开了或服务器状态变化了(比如变成维护了)。
        具体情况说完,开始接入,然后发现又踩坑里去了。先说下SDK版本,是在官网下载的Unity插件,版本是GCloud1.1.5.185491.2018111900.unityPackage,然后开始编译,各种失败,iOS和Android各种编译不通过。iOS的之前有遇到过同样的问题,猜是不是XCode10的问题,向官方要支持XCode10的framework,然后给了个Cocos和UE4版本的,嗯,什么鬼?framework全部替换成Cocos和UE4的,iOS编译通过,运行也没问题,能获取到区服数据。


        接下来是Android的问题,错误经常看到,就猜到是jar包重复,检查了下,发现MSDK和GCloud都包含了android-support-v4.jar,随意删除一个,编译成功。以为这样就结束了,太天真了。运行时一直获取不到区服数据,调试发现IsConnected接口,一直返回没有成功连接上服务器,然后去官方文档上仔细看了下,猜估计是主Activity没有继承GCloud的Activity。然后就艹了,啥玩意呀,都什么年代了,还用这么老的技术,MSDK都是用命令行修改一堆参数生成一个Jar包,接下来啥的都不用管,一到GCloud,要怎么麻烦,我们怎么接。
        咋办,大厂时间都定好了,没几天了,只能硬上了,找到编译成MSDK jar包的源码,修改源码,生成一个支持GCloud的MSDK jar包。
        在DeployAndroid.cs脚本的GenerateAdapter()接口中,添加如下代码,不要忘了拷贝相关的Jar包到该目录:


        找到Assets\Msdk\Adapter\Android\java\src\com\example\wegame目录,对MGameActivity.java进行修改。其实也就是添加下代码,代码不是乱写的呀,也不要去看文档,直接用反编译工具反编译GCloudSDK中的GCloudUnity.jar包,然后开始拷贝代码就行:
        MGameActivity.java原来的:

  1. package com.example.wegame;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.os.Looper;
  7. import com.tencent.bugly.msdk.crashreport.CrashReport;
  8. import com.tencent.msdk.WeGame;
  9. import com.tencent.msdk.adapter.MsdkActivity;
  10. import com.tencent.msdk.api.LoginRet;
  11. import com.tencent.msdk.api.WGPlatform;
  12. import com.tencent.msdk.consts.CallbackFlag;
  13. import com.tencent.msdk.consts.EPlatform;
  14. import com.tencent.msdk.consts.TokenType;
  15. import com.tencent.msdk.tools.Logger;
  16. /**.
  17. * 游戏主Activity需要继承MsdkActivity
  18. */
  19. public class MGameActivity extends MsdkActivity {
  20. private static Activity activity = null;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. activity = this;
  25. }
  26. @Override
  27. protected void onDestroy() {
  28. super.onDestroy();
  29. activity = null;
  30. }
  31. // MSDKDemo Functions
  32. /**
  33. * TODO Game 拉起支付示例,游戏需要参考米大师文档自己编写支付相关代码
  34. * 需要先安装支付示例工程AndroidPaySample(位于MSDKzip包中的Tencent AndroidPayRelease.zip中)
  35. * 才能拉起支付Demo
  36. */
  37. public static void launchPayDemo() {
  38. Logger.d("called");
  39. Intent i = new Intent("com.tencent.pay.sdksample.AndroidPaySample");
  40. LoginRet lr = new LoginRet();
  41. WGPlatform.WGGetLoginRecord(lr);
  42. // 注意:这里需要判断登录态是否有效
  43. if (lr.flag != CallbackFlag.eFlag_Succ) {
  44. if (lr.platform == EPlatform.ePlatform_Weixin.val()) {
  45. // accesstoken过期,尝试刷新票据
  46. if (lr.flag == CallbackFlag.eFlag_WX_AccessTokenExpired) {
  47. WGPlatform.WGRefreshWXToken();
  48. return;
  49. } else {
  50. // 微信登录态失效,引导用户重新登录授权
  51. return;
  52. }
  53. } else {
  54. // 手Q登录态失效,引导用户重新登录授权
  55. return;
  56. }
  57. }
  58. i.putExtra("userId", lr.open_id);
  59. i.putExtra("offerId", WeGame.getInstance().offerId);
  60. if (lr.platform == WeGame.WXPLATID) {
  61. i.putExtra("userKey", lr.getTokenByType(TokenType.eToken_WX_Access));
  62. i.putExtra("sessionType", "wc_actoken");
  63. i.putExtra("sessionId", "hy_gameid");
  64. } else if (lr.platform == WeGame.QQPLATID) {
  65. i.putExtra("userKey", lr.getTokenByType(TokenType.eToken_QQ_Pay));
  66. i.putExtra("sessionType", "kp_actoken");
  67. i.putExtra("sessionId", "openid");
  68. }
  69. i.putExtra("pf", WGPlatform.WGGetPf(""));
  70. i.putExtra("zoneId", "1");
  71. i.putExtra("pfKey", WGPlatform.WGGetPfKey());
  72. i.putExtra("acctType", "common");
  73. i.putExtra("saveValue", "60");
  74. i.putExtra("msdk", true);
  75. activity.startActivity(i);
  76. }
  77. /**
  78. * 游戏崩溃后会将堆栈信息上报到腾讯组件————灯塔中。这时制造native层崩溃测试异常上报
  79. */
  80. public static void nativeCrashTest() {
  81. // Native异常测试
  82. Logger.d("called");
  83. CrashReport.testNativeCrash();
  84. }
  85. /**
  86. * 游戏崩溃后会将堆栈信息上报到腾讯组件————灯塔中。这时制造空指针异常测试异常上报
  87. */
  88. public static void nullPointerExceptionTest() {
  89. // 空指针异常测试
  90. Logger.d("called");
  91. Handler mainHandler = new Handler(Looper.getMainLooper());
  92. mainHandler.post(new Runnable() {
  93. @Override
  94. public void run() {
  95. String str = null;
  96. str.equals("");
  97. }
  98. });
  99. }
  100. }


        MGameActivity.java修改后:

  1. package com.example.wegame;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.os.Looper;
  7. import com.tencent.bugly.msdk.crashreport.CrashReport;
  8. import com.tencent.msdk.WeGame;
  9. import com.tencent.msdk.adapter.MsdkActivity;
  10. import com.tencent.msdk.api.LoginRet;
  11. import com.tencent.msdk.api.WGPlatform;
  12. import com.tencent.msdk.consts.CallbackFlag;
  13. import com.tencent.msdk.consts.EPlatform;
  14. import com.tencent.msdk.consts.TokenType;
  15. import com.tencent.msdk.tools.Logger;
  16. import java.util.ArrayList;
  17. import java.util.List;
  18. import android.util.Log;
  19. import com.tencent.gcloud.GCloud;
  20. import android.annotation.TargetApi;
  21. import android.app.Activity;
  22. import android.content.Intent;
  23. import android.content.res.Configuration;
  24. import android.os.Bundle;
  25. /**.
  26. * 游戏主Activity需要继承MsdkActivity
  27. */
  28. public class MGameActivity extends MsdkActivity {
  29. private static Activity activity = null;
  30. private static final String tag = "GCloud";
  31. private static final int REQUEST_CODE_ASK_PERMISSION = 101;
  32. private boolean bEnableRequestPermission = true;
  33. public void setEnableRequestPermission(boolean paramBoolean)
  34. {
  35. this.bEnableRequestPermission = paramBoolean;
  36. }
  37. @Override
  38. protected void onCreate(Bundle savedInstanceState) {
  39. super.onCreate(savedInstanceState);
  40. activity = this;
  41. Object localObject = GCloud.Instance;
  42. if (!((GCloud)localObject).initialize(this))
  43. {
  44. Log.i("GCloud", "Warning!Reduplicate game activity was detected.Activity will finish immediately.");
  45. finish();
  46. return;
  47. }
  48. }
  49. protected void onNewIntent(Intent paramIntent)
  50. {
  51. try
  52. {
  53. super.onNewIntent(paramIntent);
  54. GCloud.Instance.onNewIntent(paramIntent);
  55. }
  56. catch (Exception localException)
  57. {
  58. Log.w("Exception", "onNewIntent Exception:" + localException.toString());
  59. }
  60. }
  61. protected void onPause()
  62. {
  63. try
  64. {
  65. super.onPause();
  66. GCloud.Instance.onPause();
  67. }
  68. catch (Exception localException)
  69. {
  70. Log.w("Exception", "onPause Exception:" + localException.toString());
  71. }
  72. }
  73. protected void onResume()
  74. {
  75. try
  76. {
  77. super.onResume();
  78. GCloud.Instance.onResume();
  79. }
  80. catch (Exception localException)
  81. {
  82. Log.w("Exception", "onResume Exception:" + localException.toString());
  83. }
  84. }
  85. protected void onRestart()
  86. {
  87. try
  88. {
  89. super.onRestart();
  90. GCloud.Instance.onRestart();
  91. }
  92. catch (Exception localException)
  93. {
  94. Log.w("Exception", "onDestroy Exception:" + localException.toString());
  95. }
  96. }
  97. @Override
  98. protected void onDestroy() {
  99. super.onDestroy();
  100. activity = null;
  101. try
  102. {
  103. super.onDestroy();
  104. GCloud.Instance.onDestroy();
  105. }
  106. catch (Exception localException)
  107. {
  108. Log.w("Exception", "onDestroy Exception:" + localException.toString());
  109. }
  110. }
  111. public void onConfigurationChanged(Configuration paramConfiguration)
  112. {
  113. super.onConfigurationChanged(paramConfiguration);
  114. Log.i("GCloud", "onConfigurationChanged");
  115. }
  116. public void onSaveInstanceState(Bundle paramBundle)
  117. {
  118. super.onSaveInstanceState(paramBundle);
  119. Log.i("GCloud", "onSaveInstanceState");
  120. }
  121. protected void onActivityResult(int paramInt1, int paramInt2, Intent paramIntent)
  122. {
  123. super.onActivityResult(paramInt1, paramInt2, paramIntent);
  124. GCloud.Instance.onActivityResult(paramInt1, paramInt2, paramIntent);
  125. }
  126. // MSDKDemo Functions
  127. /**
  128. * TODO Game 拉起支付示例,游戏需要参考米大师文档自己编写支付相关代码
  129. * 需要先安装支付示例工程AndroidPaySample(位于MSDKzip包中的Tencent AndroidPayRelease.zip中)
  130. * 才能拉起支付Demo
  131. */
  132. public static void launchPayDemo() {
  133. Logger.d("called");
  134. Intent i = new Intent("com.tencent.pay.sdksample.AndroidPaySample");
  135. LoginRet lr = new LoginRet();
  136. WGPlatform.WGGetLoginRecord(lr);
  137. // 注意:这里需要判断登录态是否有效
  138. if (lr.flag != CallbackFlag.eFlag_Succ) {
  139. if (lr.platform == EPlatform.ePlatform_Weixin.val()) {
  140. // accesstoken过期,尝试刷新票据
  141. if (lr.flag == CallbackFlag.eFlag_WX_AccessTokenExpired) {
  142. WGPlatform.WGRefreshWXToken();
  143. return;
  144. } else {
  145. // 微信登录态失效,引导用户重新登录授权
  146. return;
  147. }
  148. } else {
  149. // 手Q登录态失效,引导用户重新登录授权
  150. return;
  151. }
  152. }
  153. i.putExtra("userId", lr.open_id);
  154. i.putExtra("offerId", WeGame.getInstance().offerId);
  155. if (lr.platform == WeGame.WXPLATID) {
  156. i.putExtra("userKey", lr.getTokenByType(TokenType.eToken_WX_Access));
  157. i.putExtra("sessionType", "wc_actoken");
  158. i.putExtra("sessionId", "hy_gameid");
  159. } else if (lr.platform == WeGame.QQPLATID) {
  160. i.putExtra("userKey", lr.getTokenByType(TokenType.eToken_QQ_Pay));
  161. i.putExtra("sessionType", "kp_actoken");
  162. i.putExtra("sessionId", "openid");
  163. }
  164. i.putExtra("pf", WGPlatform.WGGetPf(""));
  165. i.putExtra("zoneId", "1");
  166. i.putExtra("pfKey", WGPlatform.WGGetPfKey());
  167. i.putExtra("acctType", "common");
  168. i.putExtra("saveValue", "60");
  169. i.putExtra("msdk", true);
  170. activity.startActivity(i);
  171. }
  172. /**
  173. * 游戏崩溃后会将堆栈信息上报到腾讯组件————灯塔中。这时制造native层崩溃测试异常上报
  174. */
  175. public static void nativeCrashTest() {
  176. // Native异常测试
  177. Logger.d("called");
  178. CrashReport.testNativeCrash();
  179. }
  180. /**
  181. * 游戏崩溃后会将堆栈信息上报到腾讯组件————灯塔中。这时制造空指针异常测试异常上报
  182. */
  183. public static void nullPointerExceptionTest() {
  184. // 空指针异常测试
  185. Logger.d("called");
  186. Handler mainHandler = new Handler(Looper.getMainLooper());
  187. mainHandler.post(new Runnable() {
  188. @Override
  189. public void run() {
  190. String str = null;
  191. str.equals("");
  192. }
  193. });
  194. }
  195. @TargetApi(23)
  196. public void onRequestPermissionsResult(int paramInt, String[] paramArrayOfString, int[] paramArrayOfInt)
  197. {
  198. Log.i("GCloud", "onRequestPermissionsResult: " + paramInt);
  199. super.onRequestPermissionsResult(paramInt, paramArrayOfString, paramArrayOfInt);
  200. switch (paramInt)
  201. {
  202. case 101:
  203. if ((paramArrayOfString.length <= 0) || (paramArrayOfInt.length <= 0)) {
  204. Log.e("GCloud", "onRequestPermissionsResult: permissions or grantResults is empty");
  205. } else {
  206. for (int i = 0; i < paramArrayOfString.length; i++) {
  207. if (paramArrayOfInt[0] == 0) {
  208. Log.i("GCloud", "onRequestPermissionsResult: " + paramArrayOfString[i] + " Granted!");
  209. } else {
  210. Log.i("GCloud", "onRequestPermissionsResult: " + paramArrayOfString[i] + " Denied!");
  211. }
  212. }
  213. }
  214. break;
  215. }
  216. }
  217. static
  218. {
  219. System.loadLibrary("abase");
  220. System.loadLibrary("TDataMaster");
  221. System.loadLibrary("gcloud");
  222. }
  223. }


        然后重新使用MSDK自带的Deploy按钮重新生成一个MSDK jar包,只需要这个,其他的都不需要,这样易于管理。编译通过,运行也没有问题,可以获取到区服数据。说句老实话,GCloud也不咋样,获取区服数据有点慢,需要1到10秒左右,怪不得完美世界(手游)在登陆后要播放CG,估计就是在等获取区服数据,为啥,反编译看到有GCloud的相关库。

        顺带说下,之前项目没有采用GVoice语音,用的是另外公司的SDK,主要是免费,嗯,免费。但最近在线上测试中,Crash率几乎一半都在语音SDK上,所以商量后,决定采用GVoice语音来减少Crash率(大厂对Crash率要求有点高)。之前稍微接过GVoice玩了下,因此接起来还是很快的。官方还提供了XCode10版本的,因此iOS上编译也没有太大问题。就有一个小问题,语音转文字,不要用GCloudVoiceMode.RSTT模式,要用GCloudVoiceMode.Translation模式。这个稍微坑了下,官方demo用这个模式可以转换文字,我们项目就不行,用GCloudVoiceMode.Translation就可以,有点小坑。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/603472
推荐阅读
相关标签
  

闽ICP备14008679号