it-swarm.com.de

Google+ Abmelden von einer anderen Aktivität

Ich habe mit Google+ API für Android angefangen und nach diesem Tutorial eine Anmeldeanwendung erstellt:

https://developers.google.com/+/mobile/Android/sign-in

Nun, das Problem ist, dass ich die Abmelde-Schaltfläche aus einer anderen Activity erstellen möchte und das, was ich versucht habe, nicht wirklich funktioniert hat. 

Mein GPlusLogin-Code (Aktivität für den Google+ Login):

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

}

Mein Disconnect-Code für 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;
    }


}
31
arielschon12

Fügen Sie dies einfach zu Ihrer neuen Aktivität hinzu, wo Ihr Logout-Button für Google + vorhanden sein soll:

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

und als nächstes:

 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);
                      }
                  });
      }
  });
25
sommesh

Hey, ich habe dieses Problem von mir gelöst und arbeitete wie ein Zauber

Was ist das Problem: Google plus AnmeldenIn einer Aktivität, müssen Sie sich jedoch von einer anderen Aktivität abmelden

Lösung:

Meine Google-Plus-Logout-Aktivität sieht folgendermaßen aus:

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

}

Beschreibung zur Lösung:

Für ein einzelnes Paket generiert google plus API ein Token und eine Sitzung. Machen Sie einfach eine weitere Sitzung in der Abmelde-Seite. Sie können sich jetzt problemlos von der Sitzung abmelden 

Ich habe viel über dieses Problem versucht, um mich von der aktuellen Sitzung abzumelden, probieren Sie es einfach aus. Es wird auf jeden Fall funktionieren. Zweifel lassen mich wissen

18
madhu sudhan

Es ist wahrscheinlich einfacher, eine Basisklasse zu erstellen und die Verbindungs-/Trennungsmethoden zu erben. Photohunt, unser vollständiges Muster, dokumentiert dieses Design ausführlich.

DokumenteCode

6
jonathanberi

Nachdem Sie sich über eine Woche gekämpft haben, um die Antwort herauszufinden. Ich habe dies getan Nach dem Anmelden von save boolean hat isSignedIn in sharedpreferences den Wert true.

private SharedPreferences.Editor editor;
private SharedPreferences prefs;

editor = getSharedPreferences(getString(R.string.userDetails), MODE_PRIVATE).edit();
editor.putBoolean(getString(R.string.isSignedIn), true);
editor.apply();`

Ändern Sie nun bei jeder Aktivität, wenn der Benutzer auf Abmelden klickt, den Boolean-Wert in "false".

In Ihrer Login-Aktivität, wo googleApiClient erstellt wird. In seiner onStart-Methode . Prüfen Sie, ob isSignedIn falsch ist.

@Override
public void onStart() {
super.onStart();
if (!prefs.getBoolean(getString(R.string.isSignedIn), false)) {
    signOut();
    }     
}

Machen Sie dasselbe in onConnected

@Override
public void onConnected(Bundle connectionHint) {
    if (mGoogleApiClient.isConnected()) {
        Log.i(TAG, "onConnected: " + "yes it is connected");
        if (!prefs.getBoolean(getString(R.string.isSignedIn), false)) {
            signOut();
        }
    }
}

Dies wird sich abmelden und den Zugriff widerrufen.

public void signOut() {
    if (mGoogleApiClient != null) {
        Log.e(TAG, "signOut: " + mGoogleApiClient + mGoogleApiClient.isConnected());
        Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
        if (mGoogleApiClient.isConnected()) {
                    new ResultCallback<Status>() {
                        @Override
                        public void onResult(Status status) {
                            // ...
                            Log.i(TAG, "onResult: " + mGoogleApiClient);
                        }
                    });
         Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback(
                    new ResultCallback<Status>() {
                        @Override
                        public void onResult(Status status) {
                            Log.i(TAG, "onResult: Revoke Access status:" + status.getStatus());
                        }
                    });
        }
    }
}

Jonathan hat Recht, dass eine Basisklasse oder ein Fragment Ihr Leben erleichtern würde. Der Code könnte jedoch funktionieren - das Problem ist, dass Sie prüfen, ob der PlusClient in onCreate() verbunden ist -, aber Sie verbinden ihn erst, wenn onStart(). Sie müssen wahrscheinlich die Absicht in der onConnected()-Methode überprüfen und dort die Abmeldung durchführen.

1
Ian Barber

Sie können eine Instanz von FirebaseAuth überall in der App abrufen, da FirebaseAuth eine Singleton-Klasse ist.

 mAuth = FirebaseAuth.getInstance();
 mAuth.signOut();
1
Joyal

Wenn Sie in einer anderen Aktivität auf Abmeldung klicken, senden Sie eine Absicht mit einem Zusatz, um anzuzeigen, dass die Schaltfläche "Abmelden" angeklickt ist. Dann auf Login-Aktivität

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

Andere Tätigkeit

var intent = new Intent(this.Activity,typeof(LoginActivity));
intent.PutExtra("LogoutAction",true);
1
Lee Yeong Guang

Hier ist meine Lösung. Ich habe eine UtilsSingleton-Klasse erstellt. In meinem LoginActivity habe ich ein GoogleSignInClient Objekt. Kurz vor dem Start von DashboardActivity nach dem Anmelden speichere ich die Instanz von googleSignInClient, indem ich Utils.getInstance().setGoogleSignInClient(googleSignInClient) aufrufe. Wenn ich mich jetzt anderswo abmelden möchte, habe ich diese Methode in Utils bereit:

public void signOut() {
    googleSignInClient.signOut();
    FirebaseAuth.getInstance().signOut();
}

Nun kann ich dies von jeder anderen Aktivität aus tun:

else if (id == R.id.action_logout) {
    Utils.getInstance().signOut();
    Intent intent = new Intent(this, LoginActivity.class);
    startActivity(intent);
}

Ja, Sie müssen sich von beiden abmelden. Andernfalls wird die Kontoauswahl möglicherweise nicht angezeigt, wenn Sie das nächste Mal auf die Anmeldeschaltfläche tippen.

0
Reeshabh Ranjan

Die Antwort von sommesh ist perfekt, aber für weniger Code können Sie "Public Static Method" wie folgt verwenden:

public static GoogleApiClient mGoogleApiClient;
...
...
public static void signOutFromGoogle() {
    Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
            new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    //...
                }
            });
}

Und auf Ihrer anderen Aktivität nennen Sie es:

Your_Google_Activity.mGoogleApiClient.connect();
btnSignOut.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {            
        Your_Google_Activity.signOutFromGoogle();
    }
});
0
Ali_dev