0
votes

I have followed the following tutorials to integrate Google+ in the android app. https://developers.google.com/+/mobile/android/sign-in#add_the_google_sign-in_button_to_your_app http://www.riskcompletefailure.com/2013/03/common-problems-with-google-sign-in-on.html http://www.androidhive.info/2014/02/android-login-with-google-plus-account-1/

I am able to sign in into Google account, and am able to retrieve the information also. Thing is I am not able to log out.

I am logging in G+ in Login activity and storing the session using Shared Preferences, and closing the session in another Base activity, passing the boolean value to the Login activity regarding the closing of the session. Though the Session is not active or user has not logged in, login activity automatically connects to the G+ whenever login activity is started. Tried to do logic on onConnected but to no avail.

Below is my code snippet.

public class LoginActivity extends BaseActionBar implements OnClickListener,
            ConnectionCallbacks, OnConnectionFailedListener {

        private Button btnLogin, btnFgetPwrd, btnRegister;
            // Logcat tag
        private static final String TAG = "LoginActivity";
        // Google Plus
        private static final int GOOGLE_SIGN_IN = 0;
        // Google Plus Profile Data
        String GpersonName, GpersonPhotoUrl, Gemail, googleError, GCustId;
        // Google client to interact with Google API
        private GoogleApiClient mGoogleApiClient;
        private SignInButton btnGooglePlus;

        // A flag indicating that a PendingIntent is in progress and prevents us
        // from starting further intents.
        private boolean mIntentInProgress;
        // Track whether the sign-in button has been clicked so that we know to
        // resolve all issues preventing sign-in without waiting.
        private boolean mSignInClicked;
        private ConnectionResult mConnectionResult;

        // Session Manager Class
        SessionManager session;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.login);

            // Initializing google plus api client
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).addApi(Plus.API)
                    .addScope(Plus.SCOPE_PLUS_LOGIN).build();
            // Session Manager
            session = new SessionManager(getApplicationContext());

            if (session.isLoggedIn() == false) {
                Log.v(TAG, "false");
                mSignInClicked = false;
                DataStore.LoginGoogle = false;
                if (mGoogleApiClient.isConnected()) {
                    Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
                    mGoogleApiClient.disconnect();
                    mGoogleApiClient.connect();
                }
            } else {
                Intent i = new Intent(LoginActivity.this, UserProfileActivity.class);
                startActivity(i);
            }
            btnLogin.setOnClickListener(this);
            btnFgetPwrd.setOnClickListener(this);
            btnRegister.setOnClickListener(this);
            btnGooglePlus.setOnClickListener(this);
        }

        // Facebook and Google Plus
        @Override
        protected void onActivityResult(int requestCode, int responseCode,
                Intent intent) {
            if (requestCode == GOOGLE_SIGN_IN) {
                if (responseCode != RESULT_OK) {
                    mSignInClicked = false;
                }
                mIntentInProgress = false;
                if (!mGoogleApiClient.isConnecting()) {
                    mGoogleApiClient.connect();
                }
            } else if (requestCode == FB_SIGN_IN) {
                Session.getActiveSession().onActivityResult(this, requestCode,
                        responseCode, intent);
            }
        }
        // Google Plus
        protected void onStart() {
            super.onStart();
            mGoogleApiClient.connect();
        }

        protected void onStop() {
            super.onStop();
            if (mGoogleApiClient.isConnected()) {
                mGoogleApiClient.disconnect();
            }
        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()) {

            case R.id.loginBtn:
                // Login Button Clicked
                break;

            case R.id.loginBtnFrgtPass:
                // Forgot Button Clicked
                i = new Intent(LoginActivity.this, ForgotPasswordActivity.class);
                startActivity(i);
                break;
            case R.id.loginBtnRegis:
                // Register Button Clicked
                i = new Intent(LoginActivity.this, RegisterActivity.class);
                startActivity(i);
                break;

            case R.id.loginBtn_sign_in:
                signInWithGplus();
                break;
            }
        }

        // Sign-in into google
        private void signInWithGplus() {
            if (!mGoogleApiClient.isConnecting()) {
                mSignInClicked = true;
                resolveSignInError();
            }
        }

        // Method to resolve any sign-in errors
        private void resolveSignInError() {
            Log.v(TAG, mConnectionResult.toString());
            if (mConnectionResult.hasResolution()) {
                try {
                    mIntentInProgress = true;
                    startIntentSenderForResult(mConnectionResult.getResolution()
                            .getIntentSender(), GOOGLE_SIGN_IN, null, 0, 0, 0);
                    // mConnectionResult
                    // .startResolutionForResult(this, GOOGLE_SIGN_IN);
                } catch (SendIntentException e) {
                    mIntentInProgress = false;
                    mGoogleApiClient.connect();
                }
            }
        }

        // Google+ connection
        @Override
        public void onConnected(Bundle arg0) {
            // TODO Auto-generated method stub
            Log.v(TAG, "onConnected");

            mSignInClicked = false;
            Toast.makeText(this, "User is connected to Google+", Toast.LENGTH_LONG)
                    .show();

            btnLogin.setEnabled(false);
            // Get user's information
            getProfileInformation();

        }

        // Google+ connection
        @Override
        public void onConnectionSuspended(int arg0) {
            // TODO Auto-generated method stub
            mGoogleApiClient.connect();
        }

        // Google+ connection
        @Override
        public void onConnectionFailed(ConnectionResult result) {
            // TODO Auto-generated method stub

            Log.v(TAG, result.toString());
            if (!result.hasResolution()) {
                GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this,
                        0).show();
                return;
            }
            if (!mIntentInProgress) {
                // Store the ConnectionResult for later usage
                mConnectionResult = result;

                if (mSignInClicked) {
                    // The user has already clicked 'sign-in' so we attempt to
                    // resolve all
                    // errors until the user is signed in, or they cancel.
                    resolveSignInError();
                }
            }
        } // Normal Logging in
    }

Code snippet of the logging out of session from base activity

if (session.isLoggedIn()) {
                session.logoutUser();
                DataStore.LoginGoogle = false;
                setOptionTitle(R.id.action_login, "Login");
            }
4

4 Answers

4
votes

import com.google.android.gms.auth.api.Auth;

Auth.GoogleSignInApi.signOut(googleApiClient);

Signs out the current signed-in user if any. It also clears the account previously selected by the user and a future sign in attempt will require the user pick an account again.

https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInApi

NOTE - googleApiClient object should be in the connected state to sign out the user.

2
votes

I found the solution.

After referring following sites, I found the solutions.

Android implementing Google plus login error on mConnectionResult.hasResolution()

http://www.riskcompletefailure.com/2013/03/common-problems-with-google-sign-in-on.html

I had to check the logging session in onConnected, and do the log out process. Below is the code snippet.

// Google+ connection
@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub
    Log.v(TAG, "onConnected");
    if (ShopRunDataStore.LoginGoogle) {
        Log.v(TAG, "Google logged in");
        mSignInClicked = false;
        Toast.makeText(this, "User is connected to Google+",
                Toast.LENGTH_LONG).show();
        btnfacebook.setEnabled(false);
        btnLogin.setEnabled(false);
        // Get user's information
        getProfileInformation();
    } else {
        Log.v(TAG, "In if condition to log off");
        if (mGoogleApiClient.isConnected()) {
            Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
            mGoogleApiClient.disconnect();
            // mGoogleApiClient.connect();
            mSignInClicked = false;
            btnGooglePlus.setEnabled(true);
            btnfacebook.setEnabled(false);
            btnLogin.setEnabled(true);
        }
    }
}
0
votes

If you have read carefully the documentation from the link you provided, you would have seen that there is a sample function on how to log out the use

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

https://developers.google.com/+/mobile/android/sign-in#add_the_google_sign-in_button_to_your_app

Under "Sign out the user"

0
votes

The problem with my code was that the re-login was happening before the disconnect would complete. The solution was to begin the re-login only after the disconnect would be complete i.e. in the OnConnected listener.