5

Sono stato a lottare con questo per un po '- e ho cercato estesamente per le risposte su qui ma non ho trovato alcun (quindi scuse se io ho perso una risoluzione). Sto implementando un pulsante/logica "Accedi con Google" e tutto funziona BENE quando si tratta di cambiare l'orientamento del dispositivo. In tal caso, mi vengono presentate più copie della finestra di dialogo delle autorizzazioni di Google. (Quindi se cambio orientamento tre volte, ci sono poi tre copie della finestra di dialogo delle autorizzazioni che devo cancellare prima di tornare alla schermata originale). (È possibile trovare un esempio della finestra di dialogo delle autorizzazioni here).Dialoghi di autorizzazioni multiple in Android utilizzando Accedi con Google dopo il cambio di orientamento

Pensavo di aver complicato troppo il codice, quindi ho creato una nuova attività con nient'altro che il codice delle pagine di tutorial di Google (Getting Started/Sign-In) e ho ancora lo stesso problema. (Codice qui sotto)

(FWIW, ho provato anche la creazione di una nuova attività utilizzando del IntelliJ "Nuovo -> Attività -> Attività di accesso". Opzione, con gli stessi risultati)

In aggiunta a ciò, ho provato a eseguire l'app "Quickstart" di Google e sì, lo stesso problema sta ancora accadendo!

Qualcun altro ha implementato correttamente "Accedi con Google" SENZA questo comportamento? Suppongo che, come ultima risorsa, potrei forzare la mia attività di autenticazione a comparire sempre in verticale, ma sto cercando di capire se c'è una soluzione oltre a quella.

Grazie in anticipo!

seguito è il mio codice dalla mia attività "semplificata":

package com.myapp.test.view.housekeeping; 

import android.content.Intent; 
import android.content.IntentSender; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.view.View; 
import android.widget.Toast; 
import com.myapp.test.R; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.plus.Plus; 

public class AuthenticateActivity_BareBones extends ActionBarActivity 
     implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

    /* Request code used to invoke sign in user interactions. */ 
    private static final int RC_SIGN_IN = 1; 

    /* Client used to interact with Google APIs. */ 
    private GoogleApiClient mGoogleApiClient; 

    /* A flag indicating that a PendingIntent is in progress and prevents 
    * us from starting further intents. 
    */ 
    private boolean mIntentInProgress; 

    /* Track whether the sign-in button has been clicked so that we know to resolve 
    * all issues preventing sign-in without waiting. 
    */ 
    private boolean mSignInClicked; 

    /* Store the connection result from onConnectionFailed callbacks so that we can 
    * resolve them when the user clicks sign-in. 
    */ 
    private ConnectionResult mConnectionResult; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_authenticate); 

     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(Plus.API) 
       .addScope(Plus.SCOPE_PLUS_LOGIN) 
       .build(); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if (mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     switch (requestCode) { 
      case RC_SIGN_IN: 
       if (resultCode != RESULT_OK) { 
        mSignInClicked = false; 
       } 

       mIntentInProgress = false; 

       if (!mGoogleApiClient.isConnecting()) { 
        mGoogleApiClient.connect(); 
       } 
       break; 
     } 
    } 

    public void onButtonClick(View view) { 
     int id = view.getId(); 
     switch (id) { 
      case R.id.login_authenticate_google_button: 
       if (!mGoogleApiClient.isConnecting()) { 
        mSignInClicked = true; 
        resolveSignInError(); 
       } 
       break; 
     } 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     // We've resolved any connection errors. mGoogleApiClient can be used to 
     // access Google APIs on behalf of the user. 
     mSignInClicked = false; 
     Toast.makeText(this, "Connected to Google!", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onConnectionSuspended(int cause) { 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     if (!mIntentInProgress) { 
      // Store the ConnectionResult so that we can use it later when the user clicks 
      // 'sign-in'. 
      mConnectionResult = result; 

      if (mSignInClicked) { 
       // The user has already clicked 'sign-in' so we attempt to resolve all 
       // errors until the user is signed in, or they cancel. 
       resolveSignInError(); 
      } 
     } 
    } 

    /* A helper method to resolve the current ConnectionResult error. */ 
    private void resolveSignInError() { 
     if (mConnectionResult.hasResolution()) { 
      try { 
       mIntentInProgress = true; 
       startIntentSenderForResult(mConnectionResult.getResolution().getIntentSender(), 
         RC_SIGN_IN, null, 0, 0, 0); 
      } catch (IntentSender.SendIntentException e) { 
       // The intent was canceled before it was sent. Return to the default 
       // state and attempt to connect to get an updated ConnectionResult. 
       mIntentInProgress = false; 
       mGoogleApiClient.connect(); 
      } 
     } 
    } 
} 
+0

Questo problema esiste ancora nella nuova versione 7.0.1 di Google Play Services (e la si riproduce facilmente con l'app di esempio). Oltre a ciò che hai scritto, il problema si verifica anche nella finestra di dialogo selettore account. @QuantumSheep Hai trovato una soluzione per questo? – AZ13

risposta

0

Il mSignInClicked è in realtà a guardia del caso di rotazione per voi in questo codice, quindi la risoluzione è stato licenziato correttamente, solo una volta. Ho lo stesso comportamento con la finestra di dialogo Scelta account che viene visualizzata più volte.

Questo sembra un bug nella versione 7 di Google Play Services - lo archivierà in upstream, e spero che dovrebbe essere curato in una versione futura.

Problemi correlati