Как сделать так, чтобы игровые сервисы Play не входили автоматически при запуске?

Google предоставляет BaseGameUtils библиотека, и рекомендуем нам расширить его BaseGameActivity. Однако этот класс заставляет игру автоматически входить в систему при запуске игры. Если игрок не хочет или не может подключиться к своей учетной записи Google, это может быть очень много времени в начале игры.

Так я не хочу эту функцию. Вместо этого я хочу предоставить кнопку входа. Игрок подключается только тогда, когда он нажимает эту кнопку. и с этого момента, каждый раз, когда игрок начинает игру, он автоматически подключается к своему аккаунту Google без нажатия какой-либо кнопки. Как я могу это сделать?

5 ответов


хорошо, я понял это,по умолчанию максимальное время автоматического входа составляет 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);

на 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" (или что-то еще, если вы определились с другим именем) общая предпочтение true после инициированного пользователем входа в процесс. Вы можете сделать это в onSignInSucceeded() метод BaseGameActivity класса.

надеюсь, это поможет вам. Удача.


Я сделал это так, я не знаю, является ли это лучшим способом сделать это. Я изменил класс 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 Почему вы подписываете автоматически


вызов getGameHelper().setConnectOnStart(false); из onCreate


на самом деле, код от Google работает так же, как вы говорите во втором абзаце.

Я хочу предоставить кнопку входа в систему. Игрок подключается только тогда, когда он нажимает эту кнопку. И с этого момента каждый раз, когда игрок начинает игру, он автоматически подключается к своей учетной записи Google без нажатия какой-либо кнопки. Как я могу это сделать?

  1. Помощник.способ установки создает клиенты

  2. onStart смотрит на внутреннее логическое значение для автоматического входа. Если пользователь был ранее подключен (и пользователь не вышел, или не было ошибки при отключении), то он попытается восстановить вход.

  3. beginUserInitiatedSignIn установит логическое значение автоматического входа, если будет инициировано успешное соединение

  4. onStop только завершит соединения изящно, он не сбрасывает boolean

таким образом, единственный способ, которым пользователь видит процесс входа при запуске приложения, - это если 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} * получает вызов, в противном случае вызов не будет иметь никакого эффекта. * * @автор Бруно Оливейра (Гугл)