web-dev-qa-db-fra.com

Comment faire en sorte que les services Play Game ne se connectent pas automatiquement au démarrage?

Google fournit la bibliothèque BaseGameUtils et nous recommande d'étendre sa BaseGameActivity . Cependant, cette classe fait que le jeu se connecte automatiquement à chaque démarrage du jeu. Si le joueur ne veut pas ou ne peut pas se connecter à son compte Google, cela peut être très fastidieux au début du jeu. 

Donc, je ne veux pas cette fonctionnalité. Au lieu de cela, je veux fournir un bouton de connexion. Le joueur est connecté uniquement lorsqu'il clique sur ce bouton. Et à partir de ce moment, chaque fois que le joueur commence la partie, il est automatiquement connecté à son compte Google sans cliquer sur un bouton. Comment puis-je faire ceci?

28
Hải Phong

OK, je l'ai compris, par défaut, le temps maximal de connexion automatique est de 3 , ce qui signifie que si l'utilisateur annule 3 fois, l'application ne sera plus jamais signée dans. Il est stocké dans 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;

Et il fournit également une fonction pour définir ce nombre maximum

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

Donc, si vous ne voulez aucune tentative de connexion automatique , appelez cette fonction 

C'est si vous ne voulez pas étendre BaseGameActivity

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

Ou si vous étendez BaseGameActivity

getGameHelper().setMaxAutoSignInAttempts(0);
44
Hải Phong

Dans le fichier GameHelper.Java, il existe un attribut booléen appelé mConnectOnStart qui, par défaut, est défini sur true. Changez-le simplement en false à la place:

boolean mConnectOnStart = false;

De plus, une méthode est fournie pour gérer cet attribut depuis l'extérieur de la classe:

// 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;
}

Vous pouvez utiliser la méthode ci-dessus pour personnaliser votre processus de connexion . Dans mon cas, semblable à vous, je ne souhaite pas me connecter automatiquement pour la première fois. Mais si l'utilisateur était déjà connecté, je souhaite me connecter automatiquement. Pour rendre cela possible, j'ai changé la méthode getGameHelper() qui se trouve dans la classe BaseGameActivity en ceci:

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;
}

Chaque fois, la méthode getGameHelper() est appelée à partir de onStart() dans BaseGameActivity. Dans le code ci-dessus, je viens d'ajouter la préférence partagée à conserver si l'utilisateur était déjà connecté. Et appelé la méthode setConnectOnStart() selon ce cas.

Enfin, n'oubliez pas de définir la préférence partagée "WAS_SIGNED_IN" (ou autre chose si vous avez défini sous un nom différent) sur true après le processus de connexion initié par l'utilisateur. Vous pouvez le faire dans la méthode onSignInSucceeded() de la classe BaseGameActivity.

J'espère que ceci vous aidera. Bonne chance.

10
osmangokalp

Je l'ai fait comme ça, je ne sais pas si c'est la meilleure façon de le faire. J'ai changé la classe GameHelper pour qu'elle stocke les préférences de l'utilisateur dans les préférences partagées:

...
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";

    ...

}

Voir https://github.com/playgameservices/Android-samples/blob/master/FAQ.txt line 54 pourquoi vous vous connectez automatiquement

3
Stefan Braspenning

Appelez getGameHelper().setConnectOnStart(false); depuis onCreate

1
Крум Илиев

En réalité, le code de Google fonctionne exactement comme vous le mentionnez dans le deuxième paragraphe.

Je veux fournir un bouton de connexion. Le joueur est connecté uniquement lorsqu'il clique sur ce bouton. Et à partir de ce moment, chaque fois que le joueur démarre le jeu, il est automatiquement connecté à son compte Google sans cliquer sur un bouton. Comment puis-je faire ceci?

  1. La méthode Helper.setup crée les clients

  2. onStart examine un booléen interne pour la connexion automatique. Si l'utilisateur était précédemment connecté (et que l'utilisateur ne s'est pas déconnecté ou s'il n'y a pas eu d'erreur lors de la déconnexion), il essaiera de rétablir la connexion.

  3. beginUserInitiatedSignIn définira le booléen de connexion automatique si une connexion réussie est établie

  4. onStop ne mettra fin aux connexions que normalement, il ne réinitialise pas le booléen

Par conséquent, la seule manière pour l'utilisateur de voir le processus de connexion au démarrage de votre application est si beginUserInitiatedSignIn est appelée avant d'appuyer sur un bouton.

Assurez-vous que votre beginUserInitiatedSignIn ne se trouve pas dans votre méthode onStart et qu'il n'est appelé que par un autre moyen que lorsque vous cliquez sur le bouton de connexion et que l'utilisateur n'est pas connecté.

 @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();
}

De la classe BaseGameUtil

/** * Exemple de classe de base pour les jeux. Cette implémentation se charge de la mise en place * l'objet GamesClient et la gestion de son cycle de vie. Les sous-classes doivent seulement * remplacer le résumé @link {#onSignInSucceeded} et @link {#onSignInFailed} * méthodes. Pour lancer le flux de connexion lorsque l'utilisateur clique sur la connexion *, les sous-classes doivent appeler @link {#beginUserInitiatedSignIn}. Par défaut, * cette classe instancie uniquement l'objet GamesClient. Si le PlusClient ou * Les objets AppStateClient sont également recherchés, appelez BaseGameActivity (int) * constructeur et spécifiez les clients demandés. Par exemple, demander * PlusClient et GamesClient, utilisez BaseGameActivity (CLIENT_GAMES | CLIENT_PLUS) . * Pour demander tous les clients disponibles, utilisez BaseGameActivity (CLIENT_ALL) . * Vous pouvez également spécifier les clients demandés via * @link {#setRequestedClients}, mais vous devez le faire avant @link {#onCreate} * est appelé, sinon l'appel n'aura aucun effet . * * @author Bruno Oliveira (Google)

0
user2346305