如何检查用户是不是从游戏服务默认视图中退出?

Posted

技术标签:

【中文标题】如何检查用户是不是从游戏服务默认视图中退出?【英文标题】:How can i check if user sign's out from games services default view?如何检查用户是否从游戏服务默认视图中退出? 【发布时间】:2013-08-18 18:36:05 【问题描述】:

我在我的游戏中集成了谷歌游戏服务,包括排行榜和成就。如果用户打开排行榜或成就活动,他可以从右上角的设置中退出。

如何检查用户是否实际登录? getGamesClient.isConnected() 仍然为 true,尽管用户已从 google 视图中注销。

如果我单击注销按钮(它仍然存在,因为 gamesClient 仍处于连接状态),我会收到 SecurityException:

08-16 11:01:21.262 14288-14288/? E/androidRuntime: 致命异常: main java.lang.SecurityException 在 android.os.Parcel.readException(Parcel.java:1425) 在 android.os.Parcel.readException(Parcel.java:1379) 在 com.google.android.gms.internal.bm$a$a.a(未知来源) 在 com.google.android.gms.internal.bj.signOut(未知来源) 在 com.google.android.gms.games.GamesClient.signOut(未知来源)

目前,我正在检查 ActivityForResult 响应代码并断开 GamesClient,如果它处于不一致状态,但我不喜欢这种方法。

【问题讨论】:

【参考方案1】:

尝试处理onActivityResult:

public boolean onActivityResult(int requestCode, int resultCode, Intent data)

    if (requestCode == RC_YOUR_UNIQUE_ID 
            && resultCode == GamesActivityResultCodes.RESULT_RECONNECT_REQUIRED) 
        mHelper.disconnect();
        // update your logic here (show login btn, hide logout btn).            
     else 
        mHelper.onActivityResult(requestCode, resultCode, data);
    
    return false;

RC_YOUR_UNIQUE_ID 是您用于显示排行榜或成就活动的 ID。

【讨论】:

谢谢,节省了我很多时间。 这应该更新为mHelper.disconnect()。感谢您的回答,对我帮助很大!【参考方案2】:

我认为你需要的是:isSignedIn(); 像这样:

    public boolean getSignedIn() 
    return isSignedIn();

如果用户签名与否,这将返回 true 或 false。 GameHelper.java中的方法:

    /** Returns whether or not the user is signed in. */
public boolean isSignedIn() 
    return mState == STATE_CONNECTED;

希望对你有帮助。

【讨论】:

问题是,我(或者更确切地说是 GameHelper)设置了 mState,例如在 onStop() 或 signOut() 中。但是,如果用户从 google 提供的 Leaderboard Activity 设置中注销,则不会发生类似 signOut() 的事情,因此,mState 变量不会更改,甚至会给出错误的状态,因为它表明我已登录但我不是。【参考方案3】:

就我而言,我正在执行以下操作。在MainActivity ovveride onActivityResult()RC_UNUSED 是当您调用从 Google Play 服务应用打开 LeaderboardsAchievementsSettings 活动时的 requestCode

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) 
    super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == RC_UNUSED 
&& resultCode == GamesActivityResultCodes.RESULT_RECONNECT_REQUIRED) 
        signOut();
    

    Log.i("test", "On Activity result called");
   

如下编写你的signOut() 方法

public void signOut() 
    try 
        Games.signOut(mGoogleApiClient);
    catch (SecurityException se)
        Log.i("test", "mGoogleApiClient status was disconnected when callin signOut status. message = " + se.getMessage());
    
    if (mGoogleApiClient.isConnected()) 
        mGoogleApiClient.disconnect();
    
    // update your UI logic here (show login btn, hide logout btn).

别忘了在signOut()结尾处更新你的用户界面

【讨论】:

以上是关于如何检查用户是不是从游戏服务默认视图中退出?的主要内容,如果未能解决你的问题,请参考以下文章

检测用户退出 Google Play 游戏登录

检查蛇是不是在游戏中撞到自己[关闭]

如何检查子视图控制器是不是存在

如何检查用户之前是不是在 iOS 中查看过推送通知权限警报视图?

如何检查用户是不是可以看到视图[重复]

如何检查该用户是不是已通过来自美味派的身份验证?