Google+ sign out from a different activity

前端 未结 9 1657
终归单人心
终归单人心 2020-12-05 00:17

I have started using the Google+ API for android, and I have created a sign-in application following this tutorial:

https://developers.google.com/+/mobi

相关标签:
9条回答
  • 2020-12-05 00:30

    Hey i solved this problem by myself, working like charm

    What is the problem : Google plus signIn in one activity but need to Logout from another activity

    Solution:

    My Google-plus Logout Activity is like this:

    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
    
    }
    

    Description about solution:

    For single package google plus API will generate one token & session.Just here simply make one more session in logout page also.You can easily logout from session now

    I to have tried a lot about this problem,to logout from current session, just try this .it will definitely work. any doubts let me know

    0 讨论(0)
  • 2020-12-05 00:32

    Once you click logout from another activity,try send an intent with extra to indicate that logout button is clicked. Then on Login Activity

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

    Other Activity

    var intent = new Intent(this.Activity,typeof(LoginActivity));
    intent.PutExtra("LogoutAction",true);
    
    0 讨论(0)
  • 2020-12-05 00:33

    It would probably be easier to create a base class and inherit the connect/disconnect methods. Photohunt, our full sample, documents this design in detail.

    Docs Code

    0 讨论(0)
  • 2020-12-05 00:37

    Just add this on your new activity, where you want your logout-button for google+ to be there :

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

    and next:

     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);
                          }
                      });
          }
      });
    
    0 讨论(0)
  • 2020-12-05 00:40

    After struggling for over a week to find out the answer. I did this, After signing in save boolean isSignedIn in sharedpreferences as 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();`
    

    Now from any activity when the user clicks logout, change the boolean to false.

    In your Login Activity where googleApiClient is build. In its onStart method. Check if isSignedIn is false.

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

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

    This will logout and revokeAccess.

    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());
                            }
                        });
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-05 00:51

    Jonathan is correct that a base class or a fragment would make your life easier. That said, the code here could work - the problem is that you're checking whether the PlusClient is connected in onCreate() - but you don't connect it until onStart(). You'd probably need to check the intent in the onConnected() method, and perform the sign out there.

    0 讨论(0)
提交回复
热议问题