【问题标题】:What should I do to receive turn based match update properly if I use tbmp skeleton but tbmp skeleton is not the main activity?如果我使用 tbmp 骨架但 tbmp 骨架不是主要活动,我应该怎么做才能正确接收基于回合的匹配更新?
【发布时间】:2019-02-20 02:50:30
【问题描述】:

我正在尝试使用 tbmp 骨架,但我不使用它作为主要活动。一切似乎都正常,除非在测试期间我尝试接受邀请并进入下一个回合屏幕以执行第 1 回合(第二回合)。在 onActivityResult 中(在辅助 Activity 中,我从 Intent 开始)行:

TurnBasedMatch match = data.getParcelableExtra(Multiplayer.EXTRA_TURN_BASED_MATCH);

在解组 TurnBasedMatchEntity 时触发 BadParcelableException: ClassNotFoundException

网站上先前提出的关于“在意图中传递 TurnBasedMatch 时出现 BadParcelablException”的问题没有提供任何有用的线索。我已经在以 alpha 形式发布并经过测试的代码中尝试了超过 2 打的变体。我得出的结论是,问题在于我没有将 tbmp 骨架设置为主要活动。有没有办法解决这个问题,不需要我尝试将我的正常主 Activity 与 tbmp 中的 SkeletonActivity 结合起来?否则, tbmp 作为辅助活动似乎工作得很好。它会自动登录到 google+,我可以“开始比赛”、“查看游戏”、“退出”并开始自动游戏。由“start match”创建的游戏让启动器添加到当前字符串并单击“完成”会导致可以在“检查游戏”中看到的游戏。选择对手(我的另一个 gmail 测试帐户)有效。另一个测试 gmail 帐户可以在检查游戏中看到游戏并可以接受邀请。如果其他 gmail 游戏进程处于活动状态并已登录,那么当第一个游戏进程发送邀请时,我会在第二个游戏进程中看到祝酒词,通知已收到邀请。但是,假设在 onStartMatchClicked 中使用了 getSelectOpponentsIntent,则无法到达转弯 1。用 createMatch 替换 getSelectOpponentsIntent 似乎会导致本质上是自动匹配。

如果我在第一个测试帐户中使用自动匹配开始游戏,然后在第二个测试帐户中使用自动匹配,那么在第二个帐户中我确实进入了第 1 回合,但同样的问题再次出现,因为第一个帐户可以从未真正看到或使第 2 回合移动。

本网站上还有 4 个其他问题解决了这个问题。 “如何从 Google Play 服务通知中检测 Intent”、“如何确定从 Google Play 回合通知中选择的匹配项”、“TBMP 骨架:为什么在物理设备上未调用 onTurnBasedMatchReceived 和 onInvitationReceived”和(外围)“ TBMP Skeleton-我如何覆盖通知事件”。我的帐户已启用同步功能,Google Play 游戏的通知功能已启用。在意图中添加另一个额外内容并进行搜索似乎不起作用。打开和关闭 registerMatchUpdateListener 和 registerInvitationListener 不会产生有益的结果。我认为当您将 tbmp 框架转变为不是主要活动时,了解需要对 tbmp 框架进行哪些更改会很有帮助。在我看来,这是 Java 代码的常见问题,您通常无法将代码块从一个地方移动到另一个地方,因为如果这样做会破坏。

我的替代行动方案是 1)在仅限 alpha 的 google play 帐户中设置 tbmp 骨架,并查看当 SkeletonActivity 是主要活动时问题是否重复,2)将 SkeletonActivity 移植到我的正常主要活动上,3)删除 tbmp 骨架并尝试使用 github 或 programcreek 中的另一个示例

【问题讨论】:

  • 已尝试将代码从 SkeletonActivity 移至我的主要活动。生成的应用程序似乎在转移到我的旧主要活动之前产生了相同的结果,即所有相同的行为和 BadParcelableException 错误结果仍在发生。我认为我将 tbmp 骨架放入非主要活动的问题是错误的。我尝试为这个应用发布我的游戏服务定义。在此发布之前,我依赖于 alpha 测试。由于我可以看到发布,结果没有真正的变化(最初显示的游戏状态字符串发生了变化)。
  • 我已经决定使用实时示例 ButtonClicker 而不是基于回合的示例。我发现以这种方式完成我的项目是可能的。我没有将其提交为原始问题的答案,因为它不是。不过,这是一个可行的解决方法。

标签: java android android-intent


【解决方案1】:

如果您通过通知收到邀请/比赛更新,而只是没有接到您的听众电话,请确保您记得注册听众!!!我在这上面花了太长时间,只是忘了注册听众(很肯定我太棒了)。

Games.Invitations.registerInvitationListener(mGoogleApiClient, this);
Games.TurnBasedMultiplayer.registerMatchUpdateListener(mGoogleApiClient, this);

【讨论】:

    【解决方案2】:

    不要使用下面给出的 android github 示例中的 接受邀请 代码:

    TurnBasedMatch match = data.getParcelableExtra(Multiplayer.EXTRA_TURN_BASED_MATCH);
    

    改为使用以下方法获取匹配值:

    public Task<TurnBasedMatch> acceptInvitation (String invitationId) 
    

    & 使用事件监听器来获取匹配并进一步进行轮流。

    如果您没有使用上述方法,调试应用程序正常,而发布版本崩溃并在播放商店发布后返回相同的异常。

    注册侦听器不是强制性的,它是贬值的方法,而是注册回调以获取邀请 ID。

    【讨论】:

      【解决方案3】:

      将此行添加到您的 proguard 配置中:

       -keep class  com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchEntity
      

      考虑也为邀请添加这个:

       -keep class com.google.android.gms.games.multiplayer.InvitationEntity
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 2021-03-30
        • 1970-01-01
        • 2015-02-14
        • 2019-11-13
        相关资源
        最近更新 更多