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