Android 在显示排行榜之前等待游戏连接

Android 在显示排行榜之前等待游戏连接,android,google-play-services,leaderboard,Android,Google Play Services,Leaderboard,我不喜欢Play Games服务在应用程序首次启动时自动尝试连接的标准行为,因此我禁用了该功能。在我的主菜单中有一个“显示分数”按钮。当用户按下此按钮时,我希望发生以下情况: 如果用户已连接(登录),请继续并显示排行榜 如果用户未连接,则显示“连接”对话框。连接后,显示排行榜 在主菜单上,我将有一个额外的按钮“注销”,仅当用户已连接/登录时才会显示 当用户单击按钮时,我正在执行以下操作: 代码 if (buttonPressed()){ //Display connection d

我不喜欢Play Games服务在应用程序首次启动时自动尝试连接的标准行为,因此我禁用了该功能。在我的主菜单中有一个“显示分数”按钮。当用户按下此按钮时,我希望发生以下情况:

  • 如果用户已连接(登录),请继续并显示排行榜

  • 如果用户未连接,则显示“连接”对话框。连接后,显示排行榜

  • 在主菜单上,我将有一个额外的按钮“注销”,仅当用户已连接/登录时才会显示

当用户单击按钮时,我正在执行以下操作:

代码

if (buttonPressed()){

    //Display connection dialogue and initiate log in
    getGameHelper().beginUserInitiatedSignIn();


    //Check if the user is signed in before continuing
    if (getGameHelper.isSignedIn()){

        startActivityForResult(Games.Leaderboards.getLeaderboardIntent(getApiClient(), myLeaderBoardID), 1);

    }

}
如果用户未连接:将向用户显示一个连接对话框-这很好。然后他们可以登录。一旦他们这样做了,其他什么都不会发生(代码已经移动,因此不会显示排行榜,因为用户没有登录-如果我没有检查用户是否在这里登录,应用程序将崩溃)。如果用户再次按下按钮,它将显示排行榜

我怎么能只按一个按钮就完成这一切

我想要的是,如果用户未登录,则显示登录对话框,然后在用户登录后立即显示排行榜。我需要让startActivityForResult等待用户完成登录

简言之

我需要让我的代码等待,直到它连接到播放,然后再尝试显示排行榜


如果您有任何帮助,我们将不胜感激。

您可以收到成功/失败登录的通知,如下所示:

getGameHelper().setup( 
   new GameHelper.GameHelperListener() {  
      @Override
      public void onSignInSucceeded() {
         // execute code on successful sign-in
         // for example, here you could show your leaderboard
      }
      @Override
      public void onSignInFailed() {
         // execute code on failed sign-in
      }
   };
);
if ( buttonPressed() ) {

   // check if user already signed-in and show leaderboard; otherwise do sign-in
   if ( getGameHelper.isSignedIn() )  {
      startActivityForResult( Games.Leaderboards.getLeaderboardIntent( getApiClient(), myLeaderBoardID ), 1 );
   }
   else   {
      getGameHelper().beginUserInitiatedSignIn();
      // NOTE: do nothing further here; show the leaderboard in 
      //       the listener's onSignInSucceeded() 
   }
}
当然,您应该在尝试登录之前执行此操作。然后,当登录成功时,您可以显示您的排行榜。此代码应放在创建游戏助手的位置(即在执行buttonPressed()代码之前)

此代码就位后,应将buttonPressed()代码更改为如下所示:

getGameHelper().setup( 
   new GameHelper.GameHelperListener() {  
      @Override
      public void onSignInSucceeded() {
         // execute code on successful sign-in
         // for example, here you could show your leaderboard
      }
      @Override
      public void onSignInFailed() {
         // execute code on failed sign-in
      }
   };
);
if ( buttonPressed() ) {

   // check if user already signed-in and show leaderboard; otherwise do sign-in
   if ( getGameHelper.isSignedIn() )  {
      startActivityForResult( Games.Leaderboards.getLeaderboardIntent( getApiClient(), myLeaderBoardID ), 1 );
   }
   else   {
      getGameHelper().beginUserInitiatedSignIn();
      // NOTE: do nothing further here; show the leaderboard in 
      //       the listener's onSignInSucceeded() 
   }
}
最后一点注意:所有登录操作都将调用您创建的侦听器,因此,如果您需要在多个位置使用此功能(例如,如果您希望对成就执行相同的操作),那么您需要使用一些信号,了解成功登录时需要做些什么,并在
onSignensAcceded()中采取正确的操作

发出登录成功操作的信号:

将此代码添加到类(全局范围)

接下来,在登录前设置操作(基于登录发生的位置):

最后更改侦听器以响应设置的登录操作:

getGameHelper().setup( 
   new GameHelper.GameHelperListener() {  
      @Override
      public void onSignInSucceeded() {
         if ( signInAction == SHOW_LEADERBOARD )  {
            // show your leaderboard here
         }
         else if ( signInAction == SHOW_ACHIEVEMENTS )  {
            // show achievements here
         }

         // important! reset the sign-in action so that any subsequent sign-in
         // attempts do not re-use the currently set action!
         signInAction = NO_ACTION;
      }
      @Override
      public void onSignInFailed() {
         // execute code on failed sign-in

         // important! it should also be cleared in case of an error
         signInAction = NO_ACTION;
      }
   };
);

当然,这只是实现这一点的一种方法,但在大多数情况下,它应该工作得很好。在执行登录之前,请确保将
登录操作设置为适当的值,并确保在登录完成后将其清除。

Hi@free3dom非常感谢这一点,从OnSignanced()中启动排行榜的唯一问题是这似乎不仅在用户登录时调用,而且在应用程序启动/重新启动时调用。这意味着,如果用户在未注销的情况下退出应用程序,然后重新启动,则会自动显示排行榜。这是我绝对不想要的。你知道我如何减轻这种行为吗?再次感谢!事实上,这就是我在最后一句话中的意思。理想情况下,当您(例如)希望在成功登录时显示排行榜时,您应该使用某种类型的全局状态(可能是一个成员变量),并将其设置为某个已定义的代码。如果不清楚,请告诉我,我将添加一些代码来说明我的想法:)Hi@free3dom-我确实尝试过使用布尔值并在onSignnsAcceded()中检查布尔值的状态,但它变得非常混乱和混乱!如果您能用一些代码解释我将非常感激:-)干杯!增加了一个例子。希望能有帮助,如果有什么不清楚的地方,请询问。没问题。快乐编码!