J'ai intégré google et facebook en utilisant leurs méthodes respectives. Mais après la signature réussie, je souhaite ouvrir une activité différente et de la même manière, l'utilisateur peut accéder à différentes activités. J'ai utilisé la barre d'action où je donne la possibilité de déconnecter l'un des comptes auxquels l'utilisateur s'est connecté. Comment puis-je déconnecter l'utilisateur lorsque je suis dans une activité différente de l'activité principale. Je reçois une exception et je ne suis pas en mesure de passer une référence apiclient (pour google) et une référence de session (pour facebook) à une autre activité. S'il vous plaît aider. Merci d'avance.
Déconnectez-vous de google:
Ajoutez simplement ceci sur votre nouvelle activité, où vous voulez que votre bouton de déconnexion pour google + soit présent:
@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();
}
et ensuite vous pouvez définir le bouton setOnClickListener sur:
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);
}
});
}
});
Déconnectez-vous de facebook:
public static void callFacebookLogout(Context context) {
Session session = Session.getActiveSession();
if (session != null) {
if (!session.isClosed()) {
session.closeAndClearTokenInformation();
//clear your preferences if saved
}
} else {
session = new Session(context);
Session.setActiveSession(session);
session.closeAndClearTokenInformation();
//clear your preferences if saved
}
}
Déconnectez-vous de google:
@Override
public void onClick(View view) {
if (view.getId() == R.id.sign_out_button) {
if (mGoogleApiClient.isConnected()) {
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
}
}
}
ajoutez simplement à votre nouvelle activité ceci:
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
et alors
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sign_out_button2:
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
Mis à jour le 7 nov. 2017 Dernier code pour les événements de connexion et de déconnexion
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
Google Logout
mGoogleSignInClient.signOut()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
}
});
Google RevokeAccess
mGoogleSignInClient.revokeAccess()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// [START_EXCLUDE]
updateUI(null);
// [END_EXCLUDE]
}
});
Référez-vous à Google Code Ici
Tout d'abord pour la déconnexion Facebook:
LoginManager.getInstance().logOut();
Si vous essayez de vous déconnecter d'une autre activité ou d'un autre fragment, cela vous donnera une erreur telle que Facebook sdk non initialisé. Ensuite, vous devez d’abord initialiser Facebook sdk comme ceci:
FacebookSdk.sdkInitialize(your context here);
puis déconnectez-vous du gestionnaire.
Secondaire pour la déconnexion google:
vous devez d’abord vérifier que le client google est connecté ou non et, s’il est connecté, appeler le code de déconnexion:
if (mGoogleApiClient.isConnected())
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
ici mGoogleApiClient est un objet de GoogleApiClient.
Pour compte google
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
et pour compte facebook
LoginManager.getInstance().logOut();
se déconnecter de facebook est assez facile
il suffit d'ajouter le code suivant
LoginManager.getInstance().logOut();
vous pouvez ensuite rediriger l'utilisateur vers l'activité de connexion en ajoutant le code suivant
LoginManager.getInstance().logOut();
Intent intent = new Intent(CurrentActivity.this, LoginActivity.class);
startActivity(intent);
finish();
donc votre code final pour logoutFromFacebook serait
public void logoutFromFacebook(){
LoginManager.getInstance().logOut();
Intent intent = new Intent(CurrentActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
Maintenant, appelez simplement cette méthode lors de votre événement de bouton de déconnexion.
public class LogOutActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {
GoogleApiClient mGoogleApiClient;
Button btnLogout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
btnLogut = (Button) findViewBy(R.id.btnLogout);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
btnLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(@NonNull Status status) {
}
Intent intent = new Intent(mContext, LoginActivity.class);
});
}
});
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
Juste cela aussi dans une autre activité différente de celle de connexion où vous devriez avoir le bouton de connexion.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(fromActivity.getString(R.string.default_web_client_id))
.requestEmail()
.requestProfile()
.build();
// Build a GoogleSignInClient with the options specified by gso.
GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(fromActivity, gso);
mGoogleSignInClient.signOut();
Pour vous déconnecter de Facebook.
public void logoutFromFacebook() {
Session session = Session.getActiveSession();
session.closeAndClearTokenInformation();
// Clear Preferences and other data and go back to login activty
}
Pour vous déconnecter de Google+. Gardez à l'esprit que la déconnexion de Google+ est un peu plus complexe que celle de Facebook. Vous devrez gérer un booléen pour garder une trace des événements lorsque vous cliquez sur la déconnexion (comme pour la connexion).
public void logoutFromGooglePlus() {
mGooglePlusLogoutClicked = true; // Keep track when you click logout
if (mGoogleApiClient.isConnected()) {
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
revokeAccess();
} else {
mGoogleApiClient.connect(); // It can send user to onConnected(), call logout again from there
}
}
// revoke access (if needed)
protected void revokeAccess() {
Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
// Clear data and go to login activity
}
});
}
Pour répondre à la question dans le commentaire: GoogleApiClient
peut être instancié plusieurs fois dans une application et prend toujours la même instance que celle initialisée. Alors, ne vous inquiétez pas de la façon de "passer" GoogleApiClient
entre les activités. C'est un client léger conçu pour être initialisé en tant que nouvelle instance dans chaque activité. Créez simplement une nouvelle GoogleAPiClient
, appelez .connect()
et commencez à travailler. Cependant, vous devrez implémenter les interfaces nécessaires, mais vous pouvez laisser les méthodes vides si vous ne souhaitez pas y travailler.
En ce qui concerne mLogoutClicked
boolean, vous pouvez avoir votre propre implémentation à votre guise. En gros, c'est juste un moyen de dire à la méthode onConnected()
que vous êtes venu pour une déconnexion. (Regardez le code, nous appelons aussi .connect()
lors de la déconnexion. Cela pourrait donc aller dans onConnected()
et entrer en conflit avec votre code de connexion). Vous feriez quelque chose comme ceci sur votre onconnected()
public void onConnected(Bundle connectionHint) {
if (mGooglePlusLogoutClicked) {
logoutFromGooglePlus();
mGooglePlusLogoutClicked = false;
}
}
Pour vous conseiller sur le déroulement de votre implémentation, demandez à une classe de base d'effectuer toutes les initialisations GoogleApiClient
et de laisser l'activité Login et les autres activités les étendre. Donc, il va implicitement gérer le problème d'initialisation d'un client dans chaque activité. Implémentez simplement le code onConnected()
, onConnectionFailed()
etc commun dans l'activité de base et laissez l'activité de connexion remplacer celle-ci pour implémenter la logique de connexion. (et identique pour l'activité de déconnexion. Il remplacera ces informations et gérera le code de déconnexion)