【问题标题】: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,如果它处于不一致状态,但我不喜欢这种方法。

【问题讨论】:

    标签: android google-plus securityexception google-play-games


    【解决方案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()结尾处更新你的用户界面

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-04
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多