studio - meta data android name com google android gms games app_id
¿Cómo puedo hacer que Play Game Services no inicie sesión automáticamente en el inicio? (5)
De acuerdo, por defecto, el tiempo máximo de inicio de sesión automático es 3 , lo que significa que si el usuario cancela 3 veces, la aplicación nunca más (a menos que borre los datos de la aplicación) iniciará sesión automáticamente. Está almacenada en 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;
Y también proporciona una función para establecer este número máximo
public void setMaxAutoSignInAttempts(int max) {
mMaxAutoSignInAttempts = max;
}
Entonces, si no desea ningún intento de inicio de sesión automático , simplemente llame a esta función
Esto es si no quieres extender BaseGameActivity.
gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES);
gameHelper.enableDebugLog(true);
gameHelper.setup(this);
gameHelper.setMaxAutoSignInAttempts(0);
O si amplías BaseGameActivity
getGameHelper().setMaxAutoSignInAttempts(0);
Google proporciona la biblioteca BaseGameUtils
y nos recomienda BaseGameActivity
su BaseGameActivity
. Sin embargo, esta clase hace que el juego inicie sesión automáticamente cada vez que se inicia el juego. Si el jugador no quiere o no puede conectarse a su cuenta de Google, esto puede llevar mucho tiempo al comienzo del juego.
Así que no quiero esta característica. En su lugar, quiero proporcionar un botón de inicio de sesión. El jugador está conectado solo cuando hace clic en ese botón. Y a partir de ese momento, cada vez que el jugador comienza el juego, se conecta automáticamente a su cuenta de Google sin hacer clic en ningún botón . ¿Cómo puedo hacer esto?
En el archivo GameHelper.java
hay un atributo booleano llamado mConnectOnStart
que, de forma predeterminada, se establece en verdadero. Solo cambia a false
lugar:
boolean mConnectOnStart = false;
Además, hay un método proporcionado para administrar este atributo desde fuera de la clase:
// 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;
}
Puede utilizar el método anterior para personalizar el proceso de inicio de sesión. En mi caso, al igual que usted, no quiero conectarme automáticamente la primera vez. Pero si el usuario ha iniciado sesión antes, quiero conectarme automáticamente. Para hacer esto posible, cambié el método getGameHelper()
que se encuentra en la clase BaseGameActivity
a esto:
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;
}
Cada vez, se llama al método onStart()
desde onStart()
en BaseGameActivity
. En el código anterior, acabo de agregar la preferencia compartida para mantener si el usuario inició sesión antes. Y llamó al método setConnectOnStart()
acuerdo con ese caso.
Finalmente, no olvide configurar la preferencia compartida "WAS_SIGNED_IN"
(o algo más si ha definido con un nombre diferente) en verdadero después de que el usuario inició el proceso de inicio de sesión. Puedes hacer esto en el método onSignInSucceeded()
en la clase BaseGameActivity
.
Espero que esto te ayudará. Buena suerte.
En realidad, el código de Google funciona exactamente como lo está hablando en el segundo párrafo.
Quiero proporcionar un botón de inicio de sesión. El jugador está conectado solo cuando hace clic en ese botón. Y a partir de ese momento, cada vez que el jugador comienza el juego, se conecta automáticamente a su cuenta de Google sin hacer clic en ningún botón. ¿Cómo puedo hacer esto?
El método Helper.setup crea los clientes.
onStart mira un booleano interno para el inicio de sesión automático. Si el usuario se conectó anteriormente (y el usuario no se desconectó, o no hubo un error al desconectarse), intentará restablecer el inicio de sesión.
beginUserInitiatedSignIn configurará el inicio de sesión automático booleano si se inicia una conexión exitosa
onStop solo terminará las conexiones correctamente, no restablecerá el booleano
Por lo tanto, la única forma en que el usuario ve el proceso de inicio de sesión cuando se inicia la aplicación es si se llama de alguna manera a beginUserInitiatedSignIn antes de presionar un botón.
Asegúrese de que beginUserInitiatedSignIn no esté en su método onStart, ni se llame, excepto por cualquier otro medio que no sea cuando se haga clic en el botón de inicio de sesión y el usuario NO haya iniciado sesión.
@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 clase BaseGameUtil
/ ** * Ejemplo de clase base para juegos. Esta implementación se encarga de configurar * el objeto GamesClient y de administrar su ciclo de vida. Las subclases solo necesitan * anular los métodos @link {#onSignInSucceeded} y @link {#onSignInFailed} abstract *. Para iniciar el flujo de inicio de sesión cuando el usuario hace clic en el botón de inicio de sesión *, las subclases deben llamar a @link {#beginUserInitiatedSignIn}. De forma predeterminada, * esta clase solo crea una instancia del objeto GamesClient. Si también se desean los objetos PlusClient o * AppStateClient, llame al constructor BaseGameActivity (int) * y especifique los clientes solicitados. Por ejemplo, para solicitar * PlusClient y GamesClient, use BaseGameActivity (CLIENT_GAMES | CLIENT_PLUS). * Para solicitar todos los clientes disponibles, use BaseGameActivity (CLIENT_ALL). * Alternativamente, también puede especificar los clientes solicitados a través de * @link {#setRequestedClients}, pero debe hacerlo antes de que se llame a @link {#onCreate} *, de lo contrario, la llamada no tendrá efecto. * * @autor Bruno Oliveira (Google)
Llame a getGameHelper().setConnectOnStart(false);
de onCreate
Lo hice así, no sé si esta es la mejor manera de hacerlo. Cambié la clase GameHelper para que almacene las preferencias del usuario en las preferencias compartidas:
...
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";
...
}
Consulte https://github.com/playgameservices/android-samples/blob/master/FAQ.txt línea 54 por qué inicia sesión automáticamente