【问题标题】:Android API IsConnected returning TRUE after Signing OutAndroid API IsConnected 在退出后返回 TRUE
【发布时间】:2015-01-10 05:56:16
【问题描述】:

我正在使用 Xamarin 使用 Google Play 游戏服务为 Android 开发游戏。我正在使用 Genymotion Android 模拟器进行测试。我遇到了一个似乎是 Google Play 或 Xamarin 实现中的错误的问题。

如果我退出 Google 帐户,对 IGoogleApiClient.IsConnected() 的调用会继续返回 true(即使我已经显然刚刚退出)。如果我随后尝试使用该 API 对象,我将得到如下异常:

java.lang.SecurityException: 调用 API 时未登录

例如,下面的代码在退出后执行会导致上述异常:

public void StartNewMatch()
{
    if (!mGoogleApiClient.IsConnected)
    {
        return;
    }

    Intent intent = GamesClass.TurnBasedMultiplayer.GetSelectOpponentsIntent(mGoogleApiClient, 1, 1, true);
    StartActivityForResult(intent, RC_SELECT_PLAYERS);
}

我正在退出 Google Play 游戏收件箱(匹配选择器);如下图所示。

以前有人遇到过这种情况吗?我错过了什么吗?有什么变通办法吗?

注意:只有在通过 Google 的 UI 退出时才会出现这种情况。如果我手动退出用户,使用 mGoogleApiClient.Disconnect() 之类的内容,则不会出现此问题; mGoogleApiClient.IsConnected() 现在返回 false(如预期)。

【问题讨论】:

    标签: android xamarin google-play-services monogame google-play-games


    【解决方案1】:

    为了保持登录状态同步,您必须正确实施 onActivityResult。

    这应该如下所示:

    注意:这是 java 代码,我不确定使用 Xamarin 的效果如何,但希望您能够弄清楚 :)

    @Override
    protected void onActivityResult(int requestCode, int responseCode, Intent data) {
    
        // check for "inconsistent state"
        if ( responseCode == GamesActivityResultCodes.RESULT_RECONNECT_REQUIRED && requestCode == <your_request_code_here> )  {  
    
           // force a disconnect to sync up state, ensuring that mClient reports "not connected"
           mGoogleApiClient.disconnect();
        }
    }
    

    注意:只需确保将代码中的代码替换为您使用的请求代码即可。您可能还需要检查多个请求代码。

    【讨论】:

    • 效果很好。几个注意事项:1)responseCode 是 Xamarin 中的 Result 枚举,需要将其转换为 int 和 2)我没有费心检查 requestCode,因为我认为这个 responseCode 应该导致断开连接,无论是什么触发它。跨度>
    • 只要您不从您的应用启动任何其他活动,不检查 requestCode 应该没问题,因为它们可能会为其他事情使用相同的响应值。
    【解决方案2】:

    如果你正在使用 BaseGameUtils 库中的 gameHelper 类(它更容易使用),你可以将上面的代码修改为:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        gameHelper.onActivityResult(requestCode, resultCode, data);
    
        if (resultCode == GamesActivityResultCodes.RESULT_RECONNECT_REQUIRED){
            // force a disconnect to sync up state, ensuring that mClient reports "not connected"
            gameHelper.getApiClient().disconnect();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      相关资源
      最近更新 更多