Google inicia sesión y termina sesión en android con la última API de g-plus

He pasado por algunas de las preguntas de stackoverflow relacionadas con el inicio de sesión y el inicio de sesión de google plus. Y la mayoría de ellos están anticuados. No soy capaz de lograr lo que realmente quiero.

Una vez que haya finalizado la sesión, la próxima vez que inicie sesión, quisiera que el usuario eligiera la cuenta de google disponible para iniciar sesión nuevamente.

Estoy usando el inicio de sesión y el botón de inicio de sesión personalizados. Y para firmar, tengo dos casos,

  1. Salga antes de iniciar sesión si algún usuario ya está iniciando sesión en la misma actividad de inicio de sesión.
  2. Salida de la actividad.

Esto es lo que he implementado hasta ahora:

public class LoginActivity extends AppCompatActivity implements OnClickListener{ private static final int RC_SIGN_IN = 9001; private GoogleApiClient mGoogleApiClient; private ConnectionResult mGoogleConnectionResult; private Button login; private ProgressDialog mProgressDialog; private Context mContext; private String mUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext= LoginActivity.this; requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.login_layout); login= (Button) findViewById(R.id.lg_login_btn); login.setOnClickListener(this); } @Override public void onClick(View v) { if(isOnline(mContext)){ if(v.getId()== R.id.lg_login_btn) { if(mGoogleApiClient!=null){ mGoogleApiClient.disconnect(); } GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.PLUS_LOGIN)) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(mContext.getApplicationContext()) .enableAutoManage(this , mGPlusConnectionFailedListener) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(Plus.API) .build(); signOutGPlus(); Intent lSignInIntent= Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(lSignInIntent, RC_SIGN_IN); } } else{ showAlertDialog(mContext, "Error", "Please check internet connection"); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); logD("&&onActivityResult", "requestCode: "+requestCode); // first if (requestCode == RC_SIGN_IN) { if(resultCode == RESULT_OK){ showProgressDialog(); getGPlusUserInfo(data); } else { logD("&&onActivityResult", "requestCode: RESULT_ NOT Ok"+requestCode); } } } GoogleApiClient.OnConnectionFailedListener mGPlusConnectionFailedListener= new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { logD("&&mGPlusConnectionFailedListener", "onConnectionFailed"); } }; private void getGPlusUserInfo(Intent data){ GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } private void handleSignInResult(GoogleSignInResult result) { Log.d("&&handleSignInResult", "handleSignInResult:" + result.isSuccess()); if (result.isSuccess()) { // Signed in successfully, show authenticated UI. String lDisplayName=""; String lEmail=""; String lFirstName=""; String lLastName=""; String lGender=""; // G+ if (mGoogleApiClient.hasConnectedApi(Plus.API)) { logD("&&GPlusUserInfo", "&hasConnectedApi--------------------------------"); // Deprecated Person person = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient); if(null != person) { logD("&&GPlusUserInfo", "&--------------------------------"); logD("&&GPlusUserInfo", "&Display Name: " + person.getDisplayName()); lDisplayName= person.getDisplayName(); logD("&&GPlusUserInfo", "Gender: " + person.getGender()); if(person.getGender()< MyHalConstants.GENDER.length){ lGender= MyHalConstants.GENDER[person.getGender()]; } else{ lGender= "Other"; } } } GoogleSignInAccount acct = result.getSignInAccount(); if(null != acct) { if (null != acct.getDisplayName()) { logD("&&GPlusUserInfo", "&Display Name: " + acct.getDisplayName()); } lFirstName= acct.getGivenName(); lLastName= acct.getFamilyName(); // Views inside NavigationView's header Uri uri = acct.getPhotoUrl(); } } else { // Signed out, show unauthenticated UI. signOutGPlus(); } } // sign - out private void signOutGPlus(){ logD("&&signOutGPlus", "signOutGPlus"); if(null != mGoogleApiClient){ mGoogleApiClient.connect(); mGoogleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(@Nullable Bundle bundle) { if(mGoogleApiClient.isConnected()) { logD("&&signOutGPlus", "inside"); Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(@NonNull Status status) { logD("&&signOutGPlus", "onResult"); if(mGoogleApiClient.isConnected()){ mGoogleApiClient.clearDefaultAccountAndReconnect(); mGoogleApiClient.disconnect(); } // Deprecated /*Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); //Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient); //revokeAccess();*/ } } ); } } @Override public void onConnectionSuspended(int i) { } }); } } // Not used private void revokeAccess() { logD("&&revokeAccess", "revokeAccess"); Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { // ... } }); } private void showProgressDialog() { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage(getString(R.string.loading)); mProgressDialog.setIndeterminate(true); } mProgressDialog.show(); } private void hideProgressDialog() { if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.hide(); } } private void showAlertDialog(Context pContext, String pTitle, String pMessage){ AlertDialog.Builder ldialogBuilder= new AlertDialog.Builder(pContext); ldialogBuilder.setTitle(pTitle) .setMessage(pMessage) .setPositiveButton("Ok", null); ldialogBuilder.show(); } private void dismissDialog(){ if(null != mProgressDialog){ mProgressDialog.dismiss(); mProgressDialog= null; } } } 

En cuanto a la salida de actividad diferente, ninguna de las respuestas que encontré define cómo initilaize mGoogleApiClient en la nueva actividad.

Para el inicio de sesión si implemento el siguiente código:

 private GoogleApiClient mGoogleApiClient; // sign - out private void signOutGPlusFromDifferentActivity(){ logD("&&signOutGPlus", "signOutGPlus"); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.PLUS_LOGIN)) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(mContext.getApplicationContext()) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(Plus.API) .build(); if(null != mGoogleApiClient){ mGoogleApiClient.connect(); mGoogleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(@Nullable Bundle bundle) { if(mGoogleApiClient.isConnected()) { logD("&&signOutGPlus", "inside"); Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(@NonNull Status status) { logD("&&signOutGPlus", "onResult"); if(mGoogleApiClient.isConnected()){ mGoogleApiClient.clearDefaultAccountAndReconnect(); mGoogleApiClient.disconnect(); } } } ); } } @Override public void onConnectionSuspended(int i) { } }); } } 

Se produce un error.

Al eliminar la parte de inicio de sesión de la actividad de inicio de sesión, puedo iniciar sesión correctamente desde GPlus.

Gradle:

 compile 'com.google.android.gms:play-services-auth:9.2.1' compile 'com.google.android.gms:play-services:9.2.1' 

NOTA: desde la actividad de inicio de sesión puedo iniciar sesión desde google plus o face-book.

Actividad A (Iniciar sesión desde g + o fb).

Después del inicio de sesión, el usuario se dirige a la actividad B, desde el usuario de la actividad B puede cerrar la sesión del portal adecuado (g + o fb).

La parte de Facebook está terminada. Solamente queda g +.

Por favor, ayuda en el inicio de sesión correctamente en ambos casos UTILIZANDO API ACTUALIZADAS DE LOGIN DE LOGRO DE GOOGLE.

4 Solutions collect form web for “Google inicia sesión y termina sesión en android con la última API de g-plus”

Haga esto en su segunda actividad . Si está guardando cualquier preferencia con respecto al inicio de sesión en la primera actividad,

 package com.ccc.bbbb; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks; import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.plus.People; import com.google.android.gms.plus.People.LoadPeopleResult; import com.google.android.gms.plus.Plus; //implement ConnectionCallbacks, OnConnectionFailedListener,ResultCallback<People.LoadPeopleResult> public class HomeActivity extends Activity implements OnClickListener ,ConnectionCallbacks, OnConnectionFailedListener, ResultCallback<People.LoadPeopleResult> { public static boolean isLogout=false; GoogleApiClient mGoogleApiClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this).addApi(Plus.API) .addScope(Plus.SCOPE_PLUS_LOGIN).build(); //Logout button click if(networkCheck.isNetworkAvailable(HomeActivity.this)) { Log.d(TAG, "logout if condition working...."); isLogout=true; if(mGoogleApiClient.isConnected()) { Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); mGoogleApiClient.disconnect(); mGoogleApiClient.connect(); } Toast.makeText(HomeActivity.this, "you are logged out", Toast.LENGTH_SHORT).show(); Intent intent=new Intent(HomeActivity.this,MainActivity.class); startActivity(intent); finish(); } //override below methods and copy those codes @Override public void onResult(@NonNull LoadPeopleResult arg0) { // TODO Auto-generated method stub } @Override public void onConnectionFailed(@NonNull ConnectionResult arg0) { // TODO Auto-generated method stub } @Override public void onConnected(@Nullable Bundle arg0) { // TODO Auto-generated method stub mSignInClicked = false; // updateUI(true); Plus.PeopleApi.loadVisible(mGoogleApiClient, null).setResultCallback( this); } @Override public void onConnectionSuspended(int arg0) { // TODO Auto-generated method stub mGoogleApiClient.connect(); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); mGoogleApiClient.connect(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } if (mDialog.isShowing()) { mDialog.dismiss(); } } } 

Una vez que haya finalizado la sesión, la próxima vez que inicie sesión, quisiera que el usuario eligiera la cuenta de google disponible para iniciar sesión nuevamente.

El truco consiste en borrarDefaultAccountAndReconnect el GoogleApiClient justo después de que el usuario haga clic en el botón Iniciar sesión de Google para iniciar sesión. Esto garantiza que todas las cuentas de Google disponibles siempre se muestren cada vez que haga clic en el botón de inicio de sesión.

PASO 1: Inicializar GoogleAPIClient y establecer onClickListener en googleSignInButton en Activity onCreate ()

 private GoogleApiClient mApiClient; private void initializeGoogleSignIn() { GoogleSignInOptions signInOptions = new GoogleSignInOptions .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestProfile() .build(); mApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, signInOptions) .build(); SignInButton googleSignInButton = (SignInButton) findViewById(R.id.google_sign_in); googleSignInButton.setOnClickListener(this); } 

PASO 2: Administrar el inicio de sesión de Google a través de su método onClick ()

 @Override public void onClick(View v) { switch (v.getId()) { case R.id.google_sign_in: if (mApiClient.isConnected()) { mApiClient.clearDefaultAccountAndReconnect(); } else { mApiClient.connect(); } Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mApiClient); startActivityForResult(signInIntent, RC_SIGN_IN); break; } } 

MISCALLANEOUS

 // Make sure you connect and disconnect the GoogleApiClient in onStart and onStop lifecycle methods @Override protected void onStart() { super.onStart(); mApiClient.connect(); } @Override protected void onStop() { super.onStop(); if (mApiClient.isConnected()) mApiClient.disconnect(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result != null && result.isSuccess()) { GoogleSignInAccount account = result.getSignInAccount(); setAppPreferenceData(account.getId(), account.getEmail(), String.valueOf(account.getPhotoUrl()), account.getDisplayName()); startActivity(new Intent(this, NavigationActivity.class)); finish(); } else { mProgressLayout.setVisibility(View.GONE); if (Utils.isNetworkAvailable(this)) Toast.makeText(this, "Google Authentication Failed! Please try again", Toast.LENGTH_SHORT).show(); else Toast.makeText(this, "Network Error! Please connect to your wifi.", Toast.LENGTH_LONG).show(); } } } 

¿Por qué necesita tantos métodos de devolución de llamada en su código? Supongo que complicaste un poco tu código. El principal truco es desconectar y borrar la cuenta por defecto siempre que el usuario intente iniciar sesión, lo que garantiza que siempre se muestre una lista de cuentas de google válidas. He utilizado el mismo procedimiento, se ha probado, probado y funcionando.

Sólo un método de devolución de llamada para el estado de inicio de sesión utilizado en mi aplicación.

 public class SignInActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener { } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Toast.makeText(SignInActivity.this, "Google Play connection error", Toast.LENGTH_SHORT).show(); mProgressLayout.setVisibility(View.GONE); } 

Para el inicio de sesión puede utilizar el siguiente método:

 private void signOut() { Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { Timber.d("Logged out"); } }); } 

Para iniciar sesión, puede seguir estos métodos:

 public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { this.activity = activity; if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } /*For inintializing googleapiclient*/ private void initGoogleClient() { gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); googleApiClient = new GoogleApiClient.Builder(activity) .enableAutoManage((FragmentActivity) activity /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addOnConnectionFailedListener(this) .addApi(Plus.API) .addScope(new Scope(Scopes.PROFILE)) .build(); } private void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); activity.startActivityForResult(signInIntent, RC_SIGN_IN); } 

Una vez que haya finalizado la sesión, la próxima vez que inicie sesión, quisiera que el usuario eligiera la cuenta de google disponible para iniciar sesión nuevamente.

Simplemente, cierre la sesión del usuario y revogue el acceso siempre que el usuario haga clic en el botón de cierre de sesión. La próxima vez, cuando los usuarios intenten acceder, se le pedirá que elija su cuenta de google preferida.

Puesto que estás iniciando sesión y terminando sesión en diferentes actividades, terminas con código duplicado. En lugar de duplicar el código, simplemente utilice una clase de ayuda e inicialice la opción de inicio de sesión de Google y el cliente de API de Google. Ahora, cada vez que desee utilizar Google API Client, puede inicializar la clase de ayuda.

Caso 1. Si desea salir de sesión antes de iniciar sesión, utilice clearDefaultAccountAndReconnect .

Caso 2. Para desconectarse del usuario (no importa Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback sea ​​la actividad), use Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback .

Aquí está el enlace github al proyecto. Puedes echar un vistazo si todavía tienes dudas.

  • Plus.PeopleApi.getCurrentPerson obsoleta en los servicios de Play 8.4. ¿Cómo obtener el nombre, apellido y sexo del usuario usando GoogleSignInApi?
  • No se puede obtener un cumpleaños privado de la cuenta de Google Plus aunque se solicita explícitamente
  • Salir de google y facebook en la aplicación Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.