如何让Play游戏服务在启动时不自动登录?

时间:2014-02-26 15:54:15

标签: android google-play-services google-play-games

Google提供BaseGameUtils库和recommend us to extends its BaseGameActivity。但是,该课程使游戏在游戏开始时自动登录。如果玩家不想或无法连接到他的Google帐户,那么在游戏开始时这可能非常耗时

所以我不想要这个功能。相反,我想提供一个登录按钮。只有当他点击该按钮时才能连接播放器。 从那时起,每次玩家开始游戏时,他都会自动连接到他的Google帐户,而无需点击任何按钮。我怎么能这样做?

5 个答案:

答案 0 :(得分:44)

好的,我已经弄明白了,默认情况下,最大自动登录时间是3 ,这意味着如果用户取消3次,那么该应用将永远不再(除非你清除应用程序的数据)自动登录。它存储在GameHelper.java

 // Should we start the flow to sign the user in automatically on startup? If so, up to
 // how many times in the life of the application?
 static final int DEFAULT_MAX_SIGN_IN_ATTEMPTS = 3;
 int mMaxAutoSignInAttempts = DEFAULT_MAX_SIGN_IN_ATTEMPTS;

它还提供了设置此最大数量的功能

public void setMaxAutoSignInAttempts(int max) {
        mMaxAutoSignInAttempts = max;
}

因此,如果您不想进行任何自动登录尝试,请调用此函数

如果您不想扩展BaseGameActivity

gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES);
gameHelper.enableDebugLog(true);
gameHelper.setup(this);
gameHelper.setMaxAutoSignInAttempts(0);

或者如果您扩展BaseGameActivity

getGameHelper().setMaxAutoSignInAttempts(0);

答案 1 :(得分:10)

GameHelper.java文件中有一个名为mConnectOnStart的布尔属性,默认情况下它设置为true。只需将其更改为false

boolean mConnectOnStart = false;

此外,还提供了一种从类外部管理此属性的方法:

// Not recommended for general use. This method forces the "connect on start"
// flag to a given state. This may be useful when using GameHelper in a 
// non-standard sign-in flow.
public void setConnectOnStart(boolean connectOnStart) {
    debugLog("Forcing mConnectOnStart=" + connectOnStart);
    mConnectOnStart = connectOnStart;
}

您可以使用上述方法自定义登录过程。 就我而言,与你类似,我不想第一次自动连接。但如果用户之前登录过,我确实想要自动连接。为了实现这一点,我将位于getGameHelper()类中的BaseGameActivity方法更改为:

public GameHelper getGameHelper() {
    if (mHelper == null) {
        mHelper = new GameHelper(this, mRequestedClients);
        mHelper.enableDebugLog(mDebugLog);

        googlePlaySharedPref = getSharedPreferences("GOOGLE_PLAY",
                Context.MODE_PRIVATE);
        boolean wasSignedIn = googlePlaySharedPref.getBoolean("WAS_SIGNED_IN", false);
        mHelper.setConnectOnStart(wasSignedIn);
    }
    return mHelper;
}

每次getGameHelper()方法都会从onStart()中的BaseGameActivity调用setConnectOnStart()方法。在上面的代码中,我刚刚添加了共享首选项,以便在用户之前登录时保留。并根据该案例调用"WAS_SIGNED_IN"方法。

最后,在用户启动登录过程后,不要忘记将onSignInSucceeded()(或者如果您使用不同名称定义的其他内容)共享首选项设置为true。您可以在BaseGameActivity类的{{1}}方法中执行此操作。

希望这会对你有所帮助。祝你好运。

答案 2 :(得分:3)

我是这样做的,我不知道这是否是最佳方式。我更改了GameHelper类,因此它将用户首选项存储在共享首选项中:

...
public class GameHelper implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    ....

    // Whether to automatically try to sign in on onStart(). We only set this
    // to true when the sign-in process fails or the user explicitly signs out.
    // We set it back to false when the user initiates the sign in process.
    boolean mConnectOnStart = false;

    ...    

    /** Call this method from your Activity's onStart(). */
    public void onStart(Activity act) {
        mActivity = act;
        mAppContext = act.getApplicationContext();

        debugLog("onStart");
        assertConfigured("onStart");
        SharedPreferences sp = mAppContext.getSharedPreferences(GAMEHELPER_SHARED_PREFS, Context.MODE_PRIVATE);
        mConnectOnStart = sp.getBoolean(KEY_AUTO_SIGN_IN, false);
        if (mConnectOnStart) {

        ...
    }

    ... 

    /** Sign out and disconnect from the APIs. */
    public void signOut() {

        ...

        // Ready to disconnect
        debugLog("Disconnecting client.");
        mConnectOnStart = false;
        SharedPreferences.Editor editor = mAppContext.getSharedPreferences(GAMEHELPER_SHARED_PREFS, Context.MODE_PRIVATE).edit();
        editor.putBoolean(KEY_AUTO_SIGN_IN, false);
        editor.commit();
        mConnecting = false;
        mGoogleApiClient.disconnect();
    }

    ...

    /**
     * Starts a user-initiated sign-in flow. This should be called when the user
     * clicks on a "Sign In" button. As a result, authentication/consent dialogs
     * may show up. At the end of the process, the GameHelperListener's
     * onSignInSucceeded() or onSignInFailed() methods will be called.
     */
    public void beginUserInitiatedSignIn() {
        debugLog("beginUserInitiatedSignIn: resetting attempt count.");
        resetSignInCancellations();
        mSignInCancelled = false;
        mConnectOnStart = true;
        SharedPreferences.Editor editor = mAppContext.getSharedPreferences(GAMEHELPER_SHARED_PREFS, Context.MODE_PRIVATE).edit();
        editor.putBoolean(KEY_AUTO_SIGN_IN, true);
        editor.commit();
        if (mGoogleApiClient.isConnected()) {

        ...
    }

    ...

    private final String GAMEHELPER_SHARED_PREFS = "GAMEHELPER_SHARED_PREFS";
    private final String KEY_SIGN_IN_CANCELLATIONS = "KEY_SIGN_IN_CANCELLATIONS";
    private final String KEY_AUTO_SIGN_IN = "KEY_AUTO_SIGN_IN";

    ...

}

请参阅https://github.com/playgameservices/android-samples/blob/master/FAQ.txt第54行自动登录的原因

答案 3 :(得分:1)

从onCreate

调用getGameHelper().setConnectOnStart(false);

答案 4 :(得分:0)

实际上,Google的代码与您在第二段中所讨论的完全一样。

  

我想提供一个登录按钮。只有当他点击该按钮时才能连接播放器。从那时起,每次玩家开始游戏时,他都会自动连接到他的Google帐户,而无需点击任何按钮。我怎么能这样做?

  1. Helper.setup方法创建客户端

  2. onStart查看自动登录的内部布尔值。如果用户之前已连接(并且用户未注销,或断开连接时没有错误),则会尝试重新登录。

  3. 如果启动成功连接,beginUserInitiatedSignIn将设置自动登录布尔值

  4. onStop只会优雅地终止连接,它不会重置布尔值

  5. 因此,用户在应用启动时看到登录过程的唯一方法是,在按下按钮之前以某种方式调用beginUserInitiatedSignIn。

    确保您的beginUserInitiatedSignIn不在您的onStart方法中,也不会被调用,除非您单击登录按钮并且用户未登录时通过任何其他方式调用。

     @Override
    protected void onCreate(Bundle b) {
        super.onCreate(b);
        mHelper = new GameHelper(this);
        if (mDebugLog) {
            mHelper.enableDebugLog(mDebugLog, mDebugTag);
        }
        mHelper.setup(this, mRequestedClients, mAdditionalScopes);
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        mHelper.onStart(this);
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        mHelper.onStop();
    }
    
    
    protected void beginUserInitiatedSignIn() {
        mHelper.beginUserInitiatedSignIn();
    }
    

    来自BaseGameUtil类

      

    / **    *游戏的基本类示例。此实现负责设置    * GamesClient对象并管理其生命周期。子类只需要    *覆盖@link {#onSignInSucceeded}和@link {#onSignInFailed}摘要    * 方法。在用户单击登录时启动登录流程    *按钮,子类应调用@link {#beginUserInitiatedSignIn}。默认情况下,    *此类仅实例化GamesClient对象。如果是PlusClient或    *也需要AppStateClient对象,调用BaseGameActivity(int)    *构造函数并指定所请求的客户端。例如,要求    * PlusClient和GamesClient,使用BaseGameActivity(CLIENT_GAMES | CLIENT_PLUS)。    *要请求所有可用的客户端,请使用BaseGameActivity(CLIENT_ALL)。    *或者,您也可以通过指定所请求的客户端    * @link {#setRequestedClients},但你必须在@link {#onCreate}之前这样做    *被调用,否则调用将无效。    *    * @author Bruno Oliveira(谷歌)

相关问题