5

Przez jakiś czas się z tym zmagałem - i intensywnie szukałem odpowiedzi tutaj, ale nie znalazłem żadnych (przepraszam, jeśli mam brakowało rezolucji). Wdrażam przycisk/logikę "Zaloguj się za pomocą Google" i wszystko działa dobrze, Z WYJĄTKIEM, jeśli chodzi o zmianę orientacji urządzenia. W takim przypadku otrzymuję wiele kopii okna dialogowego uprawnień Google. (Więc jeśli zmienię orientację trzy razy, są wtedy trzy kopie okna dialogowego uprawnień, które muszę anulować przed powrotem do mojego pierwotnego ekranu). (Przykład okna dialogowego uprawnień można znaleźć here).Wiele okien dialogowych uprawnień w systemie Android za pomocą Zaloguj się za pomocą Google po zmianie orientacji

Pomyślałem, że zbyt skomplikowałem kod, więc wykonałem nową czynność z samym tylko kodem z tutorialowych stron Google'a (Getting Started/Sign-In) i nadal mam ten sam problem. (Kod poniżej)

(FWIW, próbowałem też stworzenie nowego Aktywny użyciu IntelliJ w "New -> Działalność -> Logowanie aktywność". Opcji, z tych samych wyników)

Poza tym, ja próbowałem uruchomić aplikację Google "Szybki start" i tak, ten sam problem nadal się pojawia!

Czy ktoś inny z powodzeniem zaimplementował opcję "Zaloguj się w Google" BEZ tego zachowania? Przypuszczam, że w ostateczności mógłbym zmusić moją aktywność uwierzytelniania, by zawsze pojawiała się w portretach, ale próbuję sprawdzić, czy istnieje rozdzielczość poza tym.

Z góry dziękuję!

Poniżej mój kod z moim „uproszczonej” aktywność:

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

Ten problem nadal występuje w nowych usługach Google Play w wersji 7.0.1 (i można go łatwo odtworzyć za pomocą przykładowej aplikacji). Oprócz tego, co napisałeś, problem występuje również w oknie wyboru konta. @QuantumSheep Masz rozwiązanie tego problemu? – AZ13

Odpowiedz

0

mSignInClicked faktycznie pilnuje sprawę rotacji dla ciebie w tym kodzie, więc rozdzielczość jest wyrzuceniu właściwie, tylko raz. Podobne zachowanie występuje w oknie dialogowym Wybieranie konta, które jest wyświetlane wielokrotnie.

To wygląda na błąd w wersji 7 Usług Google Play - zgłoś to wcześniej i mam nadzieję, że w przyszłej wersji zajmie się nim.

Powiązane problemy