Salir de Google+ de una actividad diferente
Comencé a usar la Google+ API
para android y he creado una aplicación de inicio de sesión después de este tutorial:
Https://developers.google.com/+/mobile/android/sign-in
- Android Google + integración a veces devuelve valores nulos
- El cierre de sesión de otra actividad en Google más la integración no es un trabajo
- Validación del lado del servidor de token de Google Access para la aplicación de Android
- Mensaje INVALID_KEY que intenta autenticarse mediante el botón de inicio de sesión de Google+
- Token de acceso recuperado: null. Com.google.android.gms.auth.GoogleAuthException: Desconocido
Ahora, el problema es que quiero crear el botón de salida de una Activity
diferente, y lo que intenté hacer no funcionó realmente.
Mi código de GPlusLogin (Actividad para el inicio de sesión de Google+):
import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.content.IntentSender.SendIntentException; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import com.google.android.gms.common.*; import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks; import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener; import com.google.android.gms.plus.PlusClient; public class GPlusLogin extends Activity implements ConnectionCallbacks, OnConnectionFailedListener{ private static final int REQUEST_CODE_RESOLVE_ERR = 9000; private static final String TAG = "GPlusLogin"; private ProgressDialog mConnectionProgressDialog; private PlusClient mPlusClient; private ConnectionResult mConnectionResult; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.gplus_layout); mPlusClient = new PlusClient.Builder(this, this, this).setVisibleActivities("http://schemas.google.com/AddActivity", "http://schemas.google.com/BuyActivity").build(); Bundle extras = getIntent().getExtras(); mConnectionProgressDialog = new ProgressDialog(this); mConnectionProgressDialog.setMessage("Signing in..."); if(extras!=null){ if(extras.getString("signout")!=null){ if (mPlusClient.isConnected()) { mPlusClient.clearDefaultAccount(); mPlusClient.disconnect(); mPlusClient.connect(); finish(); startActivity(getIntent()); } } }else{ findViewById(R.id.sign_in_button).setOnClickListener(new OnClickListener() { public void onClick(View view) { // TODO Auto-generated method stub if (view.getId() == R.id.sign_in_button && !mPlusClient.isConnected()) { if (mConnectionResult == null) { mConnectionProgressDialog.show(); } else { try { mConnectionResult.startResolutionForResult(GPlusLogin.this, REQUEST_CODE_RESOLVE_ERR); } catch (SendIntentException e) { // Try connecting again. mConnectionResult = null; mPlusClient.connect(); } } } } }); } } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); mPlusClient.connect(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); mPlusClient.disconnect(); } @Override public void onConnectionFailed(ConnectionResult result) { // TODO Auto-generated method stub if (mConnectionProgressDialog.isShowing()) { // The user clicked the sign-in button already. Start to resolve // connection errors. Wait until onConnected() to dismiss the // connection dialog. if (result.hasResolution()) { try { result.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR); } catch (SendIntentException e) { mPlusClient.connect(); } } } mConnectionResult = result; } @Override protected void onActivityResult(int requestCode, int responseCode, Intent intent) { if (requestCode == REQUEST_CODE_RESOLVE_ERR && responseCode == RESULT_OK) { mConnectionResult = null; mPlusClient.connect(); } } @Override public void onConnected() { // TODO Auto-generated method stub mConnectionProgressDialog.dismiss(); Intent main = new Intent(GPlusLogin.this, MainActivity.class); main.putExtra("result", true); startActivity(main); } @Override public void onDisconnected() { // TODO Auto-generated method stub Log.d(TAG, "disconnected"); } }
Mi código de desconexión en MainActivity
:
import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Bundle extras = getIntent().getExtras(); if(extras==null){ Intent intent = new Intent(this, GPlusLogin.class); startActivity(intent); } TextView text1 = (TextView) findViewById(R.id.text1); text1.setText("You Are Connected :D"); Button SignOut = (Button) findViewById(R.id.sign_out_gplus); SignOut.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this, GPlusLogin.class); intent.putExtra("signout", true); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
- Cómo obtener amigos de Google+ en Android
- El botón de inicio de sesión Android de Google no funciona
- Cómo integrar mi aplicación con google +
- No se puede resolver la clase com.google.android.gms.plus.Plus
- ¿Qué significa RC_SIGN_IN en googleplus login?
- Identidad de sitios cruzados de Google y de Google
- Import com.google.android.gms.common.api.GoogleApiClient; no se puede resolver
- Obtener tiempo de caducidad de token de acceso de Google en Android
Hey he resuelto este problema por mí mismo, trabajando como encanto
¿Cuál es el problema: Google signIn más en una actividad, pero necesita salir de otra actividad
Solución:
Mi actividad de cierre de sesión de Google-plus es la siguiente:
public class MainActivity extends Activity implements OnClickListener, ConnectionCallbacks, OnConnectionFailedListener, ResultCallback<People.LoadPeopleResult> { GoogleApiClient mGoogleApiClient; boolean mSignInClicked; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this).addApi(Plus.API) .addScope(Plus.SCOPE_PLUS_LOGIN).build(); //copy this code on "Logout" Onclick logout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (mGoogleApiClient.isConnected()) { Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); mGoogleApiClient.disconnect(); mGoogleApiClient.connect(); // updateUI(false); System.err.println("LOG OUT ^^^^^^^^^^^^^^^^^^^^ SUCESS"); } } }); } @Override public void onConnected(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(); // updateUI(false); } @Override public void onConnectionFailed(ConnectionResult arg0) { // TODO Auto-generated method stub } protected void onStart() { super.onStart(); mGoogleApiClient.connect(); } protected void onStop() { super.onStop(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } } @Override public void onResult(LoadPeopleResult arg0) { // TODO Auto-generated method stub }
Descripción sobre solution:
Para el paquete único google plus API generará un token & session.Just aquí simplemente hacer una sesión más en la página de logout también. Usted puede fácilmente salir de la sesión ahora
He intentado mucho sobre este problema, para cerrar sesión de la sesión actual, sólo intente esto. Definitivamente funcionará. Cualquier duda que me haga saber
Sólo tienes que añadir esto en tu nueva actividad, donde quieres que tu botón de cierre de sesión para google + esté allí:
@Override protected void onStart() { GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); mGoogleApiClient.connect(); super.onStart(); }
y después:
signout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { // ... Toast.makeText(getApplicationContext(),"Logged Out",Toast.LENGTH_SHORT).show(); Intent i=new Intent(getApplicationContext(),MainActivity.class); startActivity(i); } }); }
});
Probablemente sería más fácil crear una clase base y heredar los métodos de conexión / desconexión. Photohunt, nuestra muestra completa, documenta este diseño en detalle.
Código Docs
Jonathan está en lo cierto que una clase base o un fragmento te haría la vida más fácil. Dicho esto, el código aquí podría funcionar – el problema es que está comprobando si el PlusClient está conectado en onCreate()
– pero no lo conecta hasta onStart()
. Es probable que tenga que comprobar la intención en el método onConnected()
y realizar el signo hacia fuera allí.
Una vez que haga clic en cerrar sesión de otra actividad, intente enviar una intención con extra para indicar que se ha hecho clic en el botón de cierre de sesión. Luego en la actividad de inicio de sesión
if (Intent.Extras != null && Intent.Extras.ContainsKey("LogoutAction")) { _logoutRequest = Intent.Extras.GetBoolean("LogoutAction"); } if (_logoutRequest) { await PlusClass.AccountApi.RevokeAccessAndDisconnect(_apiClient); _apiClient.Disconnect(); _apiClient.Connect (); _logoutRequest = false; }
Otra Actividad
var intent = new Intent(this.Activity,typeof(LoginActivity)); intent.PutExtra("LogoutAction",true);