Android 在显示排行榜之前等待游戏连接
我不喜欢Play Games服务在应用程序首次启动时自动尝试连接的标准行为,因此我禁用了该功能。在我的主菜单中有一个“显示分数”按钮。当用户按下此按钮时,我希望发生以下情况:Android 在显示排行榜之前等待游戏连接,android,google-play-services,leaderboard,Android,Google Play Services,Leaderboard,我不喜欢Play Games服务在应用程序首次启动时自动尝试连接的标准行为,因此我禁用了该功能。在我的主菜单中有一个“显示分数”按钮。当用户按下此按钮时,我希望发生以下情况: 如果用户已连接(登录),请继续并显示排行榜 如果用户未连接,则显示“连接”对话框。连接后,显示排行榜 在主菜单上,我将有一个额外的按钮“注销”,仅当用户已连接/登录时才会显示 当用户单击按钮时,我正在执行以下操作: 代码 if (buttonPressed()){ //Display connection d
- 如果用户已连接(登录),请继续并显示排行榜
- 如果用户未连接,则显示“连接”对话框。连接后,显示排行榜
- 在主菜单上,我将有一个额外的按钮“注销”,仅当用户已连接/登录时才会显示
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()中检查布尔值的状态,但它变得非常混乱和混乱!如果您能用一些代码解释我将非常感激:-)干杯!增加了一个例子。希望能有帮助,如果有什么不清楚的地方,请询问。没问题。快乐编码!