5

Ich habe mit diesem eine Weile gerungen - und ich habe ausgiebig nach Antworten auf hier gesucht, aber habe keine gefunden (so Entschuldigung, wenn ich habe eine Entschließung verpasst. Ich implementiere eine Schaltfläche "Anmelden mit Google" und alles funktioniert einwandfrei, AUSSER wenn es um die Änderung der Geräteausrichtung geht. In diesem Fall werden mir mehrere Kopien des Google-Berechtigungsdialogs angezeigt. (Wenn ich also die Ausrichtung dreimal ändere, gibt es dann drei Kopien des Berechtigungsdialogs, den ich abbrechen muss, bevor ich wieder zu meinem ursprünglichen Bildschirm zurückkehrt). (Ein Beispiel für den Berechtigungsdialog ist here).Mehrere Berechtigungen Dialoge in Android mit Anmeldung bei Google nach Ausrichtung Änderung

Ich dachte, ich hätte den Code zu kompliziert gemacht, also habe ich eine neue Aktivität mit nichts als dem Code von Googles Tutorial-Seiten (Getting Started/Sign-In) gemacht, und ich habe immer noch das gleiche Problem. (Code unten)

(FWIW, ich habe auch versucht, eine neue Aktivität zu schaffen mit IntelliJ "New -> Aktivität -> Login Activity". Option, mit dem gleichen Ergebnis)

Zusätzlich zu, dass ich habe versucht, Googles "Quickstart" -App auszuführen und ja, das gleiche Problem ist immer noch passiert!

Hat jemand anderes "Anmeldung mit Google" OHNE dieses Verhalten erfolgreich implementiert? Ich denke, als letzten Ausweg könnte ich meine Authentifizierungsaktivität immer im Hochformat erscheinen lassen, aber ich versuche herauszufinden, ob es darüber hinaus eine Lösung gibt.

Vielen Dank im Voraus!

Im Anschluss an meinem Code von meiner „vereinfacht“ Aktivität:

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

Dieses Problem besteht weiterhin in der neuen Google Play Services-Bibliothek lib 7.0.1 (und Sie reproduzieren es problemlos mit der Beispielanwendung). Zusätzlich zu dem, was Sie geschrieben haben, tritt das Problem auch im Kontoauswahldialog auf. @QuantumSheep Haben Sie eine Lösung dafür gefunden? – AZ13

Antwort

0

Die mSignInClicked tatsächlich sind die Rotation Fall für Sie in diesem Code bewacht, so dass die Auflösung richtig gebrannt wird, nur einmal. Ich bekomme das gleiche Verhalten, wenn der Dialog Kontoauswahl mehrmals erneut angezeigt wird.

Das sieht wie ein Fehler in Version 7 von Google Play Services aus - wird diese Upstream-Datei ablegen, und hoffentlich sollte es in einer zukünftigen Version behandelt werden.