您可以通过以下方式收到登录成功/失败的通知:
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
}
};
);
您当然应该在尝试登录之前执行此操作。然后,您可以在登录成功时显示您的排行榜。此代码应放置在您创建游戏助手的位置(即在执行 buttonPressed() 代码之前)。
此代码到位后,您应该将 buttonPressed() 代码更改为如下所示:
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()
}
}
最后一点:所有登录操作都会调用您创建的侦听器,因此如果您需要在多个地方拥有此功能(例如,如果您想对成就做同样的事情),那么您将需要使用一些信号来说明成功登录后需要发生的事情并在onSignInSucceeded() 中采取正确的操作。
发出登录成功的信号:
将此代码添加到您的类(全局范围)
public final static int NO_ACTION = 0;
public final static int SHOW_LEADERBOARD = 1;
public final static int SHOW_ACHIEVEMENTS = 2;
public int signInAction = NO_ACTION;
接下来在登录前设置操作(基于登录发生的位置):
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 {
// NEW: request leaderboard to be shown upon sign in
signInAction = SHOW_LEADERBOARD;
// NEW----------------------------------------------
getGameHelper().beginUserInitiatedSignIn();
// NOTE: do nothing further here; show the leaderboard in
// the listener's onSignInSucceeded()
}
}
最后更改监听器以响应设置的登录操作:
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;
}
};
);
当然,这只是实现此目的的一种方法,但它应该适用于大多数用途。请务必在执行登录之前将signInAction 设置为适当的值 - 并确保在登录完成后将其清除。