android – 如何检查用户是否已登录Google?

我正在写一个需要用户登录的应用程序.

我想通过Google实现,并按照以下文章设置我的登录活动LoginActivity:

> Getting Started with the Google+ Platform for Android
> Google+ Sign-in for Android

流程:

>用户打开我的应用程序 – MainActivity
>它检查用户是否已登录
>如果用户尚未登录,则会将用户重定向到LoginActivity.否则,它仍然在MainActivity.

在MainActivity中,如何检查用户是否已登录

以下是LoginActivity.java的代码
包com.noideaBox.googlelogin;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.Googleapiclient;
import com.google.android.gms.common.api.Googleapiclient.ConnectionCallbacks;
import com.google.android.gms.common.api.Googleapiclient.OnConnectionFailedListener;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.model.people.Person;

import android.app.PendingIntent;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class LoginActivity extends FragmentActivity implements
        ConnectionCallbacks,OnConnectionFailedListener,View.OnClickListener {

    private static final String TAG = "android-plus-quickstart";

    private static final int STATE_DEFAULT = 0;
    private static final int STATE_SIGN_IN = 1;
    private static final int STATE_IN_PROGRESS = 2;

    private static final int RC_SIGN_IN = 0;

    private static final String SAVED_PROGRESS = "sign_in_progress";

    private Googleapiclient mGoogleapiclient;

    // We use mSignInProgress to track whether user has clicked sign in.
    // mSignInProgress can be one of three values:
    //
    // STATE_DEFAULT: The default state of the application before the user
    // has clicked 'sign in',or after they have clicked
    // 'sign out'. In this state we will not attempt to
    // resolve sign in errors and so will display our
    // Activity in a signed out state.
    // STATE_SIGN_IN: This state indicates that the user has clicked 'sign
    // in',so resolve successive errors preventing sign in
    // until the user has successfully authorized an account
    // for our app.
    // STATE_IN_PROGRESS: This state indicates that we have started an intent to
    // resolve an error,and so we should not start further
    // intents until the current intent completes.
    private int mSignInProgress;

    // Used to store the PendingIntent most recently returned by Google Play
    // services until the user clicks 'sign in'.
    private PendingIntent mSignInIntent;

    private SignInButton mSignInButton;
    private Button mSignOutButton;
    private Button mRevokeButton;
    private TextView mStatus;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        mSignInButton = (SignInButton) findViewById(R.id.sign_in_button);
        mSignOutButton = (Button) findViewById(R.id.sign_out_button);
        mRevokeButton = (Button) findViewById(R.id.revoke_access_button);
        mStatus = (TextView) findViewById(R.id.sign_in_status);

        mSignInButton.setonClickListener(this);
        mSignOutButton.setonClickListener(this);
        mRevokeButton.setonClickListener(this);

        if (savedInstanceState != null) {
            mSignInProgress = savedInstanceState.getInt(SAVED_PROGRESS,STATE_DEFAULT);
        }

        mGoogleapiclient = build_Googleapiclient();
    }

    @Override
    protected void onStart() {
        super.onStart();
        mGoogleapiclient.connect();
    }

    @Override
    protected void onStop() {
        super.onStop();

        if (mGoogleapiclient.isConnected()) {
            mGoogleapiclient.disconnect();
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(SAVED_PROGRESS,mSignInProgress);
    }

    @Override
    public void onClick(View v) {
        if (!mGoogleapiclient.isConnecting()) {
            // We only process button clicks when Googleapiclient is not
            // transitioning
            // between connected and not connected.
            switch (v.getId()) {
            case R.id.sign_in_button:
                mStatus.setText(R.string.status_signing_in);
                resolveSignInError();
                break;
            case R.id.sign_out_button:
                // We clear the default account on sign out so that Google Play
                // services will not return an onConnected callback without user
                // interaction.
                Plus.AccountApi.clearDefaultAccount(mGoogleapiclient);
                mGoogleapiclient.disconnect();
                mGoogleapiclient.connect();
                break;
            case R.id.revoke_access_button:
                // After we revoke permissions for the user with a
                // Googleapiclient
                // instance,we must discard it and create a new one.
                Plus.AccountApi.clearDefaultAccount(mGoogleapiclient);
                // Our sample has caches no user data from Google+,however we
                // would normally register a callback on
                // revokeAccessAnddisconnect
                // to delete user data so that we comply with Google developer
                // policies.
                Plus.AccountApi.revokeAccessAnddisconnect(mGoogleapiclient);
                mGoogleapiclient = build_Googleapiclient();
                mGoogleapiclient.connect();
                break;
            }
        }
    }

    /*
     * onConnected is called when our Activity successfully connects to Google
     * Play services. onConnected indicates that an account was selected on the
     * device,that the selected account has granted any requested permissions
     * to our app and that we were able to establish a service connection to
     * Google Play services.
     */
    @Override
    public void onConnected(Bundle connectionHint) {
        // Reaching onConnected means we consider the user signed in.
        Log.i(TAG,"onConnected");

        // Update the user interface to reflect that the user is signed in.
        mSignInButton.setEnabled(false);
        mSignOutButton.setEnabled(true);
        mRevokeButton.setEnabled(true);

        // Retrieve some profile information to personalize our app for the
        // user.
        Person currentUser = Plus.PeopleApi.getCurrentPerson(mGoogleapiclient);

        mStatus.setText(String.format(
            getResources().getString(R.string.signed_in_as),currentUser.getdisplayName()
        ));

        // Indicate that the sign in process is complete.
        mSignInProgress = STATE_DEFAULT;

        Toast.makeText(this,mStatus.getText(),Toast.LENGTH_LONG).show();
    }

    /*
     * onConnectionFailed is called when our Activity Could not connect to
     * Google Play services. onConnectionFailed indicates that the user needs to
     * select an account,grant permissions or resolve an error in order to sign
     * in.
     */
    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // Refer to the javadoc for ConnectionResult to see what error codes
        // might
        // be returned in onConnectionFailed.
        Log.i(TAG,"onConnectionFailed: ConnectionResult.getErrorCode() = " + result.getErrorCode());

        if (mSignInProgress != STATE_IN_PROGRESS) {
            // We do not have an intent in progress so we should store the
            // latest
            // error resolution intent for use when the sign in button is
            // clicked.
            mSignInIntent = result.getResolution();

            if (mSignInProgress == STATE_SIGN_IN) {
                // STATE_SIGN_IN indicates the user already clicked the sign in
                // button
                // so we should continue processing errors until the user is
                // signed in
                // or they click cancel.
                resolveSignInError();
            }
        }

        // In this sample we consider the user signed out whenever they do not
        // have
        // a connection to Google Play services.
        onSignedOut();
    }

    /*
     * Starts an appropriate intent or dialog for user interaction to resolve
     * the current error preventing the user from being signed in. This Could be
     * a dialog allowing the user to select an account,an activity allowing the
     * user to consent to the permissions being requested by your app,a setting
     * to enable device networking,etc.
     */
    private void resolveSignInError() {
        if (mSignInIntent != null) {
            // We have an intent which will allow our user to sign in or
            // resolve an error. For example if the user needs to
            // select an account to sign in with,or if they need to consent
            // to the permissions your app is requesting.

            try {
                // Send the pending intent that we stored on the most recent
                // OnConnectionFailed callback. This will allow the user to
                // resolve the error currently preventing our connection to
                // Google Play services.
                mSignInProgress = STATE_IN_PROGRESS;
                startIntentSenderForResult(
                    mSignInIntent.getIntentSender(),RC_SIGN_IN,null,0
                );
            } catch (SendIntentException e) {
                Log.i(TAG,"Sign in intent Could not be sent: " + e.getLocalizedMessage());
                // The intent was canceled before it was sent. Attempt to
                // connect to
                // get an updated ConnectionResult.
                mSignInProgress = STATE_SIGN_IN;
                mGoogleapiclient.connect();
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data) {
        switch (requestCode) {
        case RC_SIGN_IN:
            if (resultCode == RESULT_OK) {
                // If the error resolution was successful we should continue
                // processing errors.
                mSignInProgress = STATE_SIGN_IN;
            } else {
                // If the error resolution was not successful or the user
                // canceled,// we should stop processing errors.
                mSignInProgress = STATE_DEFAULT;
            }

            if (!mGoogleapiclient.isConnecting()) {
                // If Google Play services resolved the issue with a dialog then
                // onStart is not called so we need to re-attempt connection
                // here.
                mGoogleapiclient.connect();
            }
            break;
        }
    }

    @Override
    public void onConnectionSuspended(int cause) {
        // The connection to Google Play services was lost for some reason.
        // We call connect() to attempt to re-establish the connection or get a
        // ConnectionResult that we can attempt to resolve.
        mGoogleapiclient.connect();
    }

    private Googleapiclient build_Googleapiclient() {
        // When we build the Googleapiclient we specify where connected and
        // connection Failed callbacks should be returned,which Google Apis our
        // app uses and which OAuth 2.0 scopes our app requests.
        return new Googleapiclient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Plus.API,null)
            .addScope(Plus.ScopE_PLUS_LOGIN)
            .build();
    }

    private void onSignedOut() {
        // Update the UI to reflect that the user is signed out.
        mSignInButton.setEnabled(true);
        mSignOutButton.setEnabled(false);
        mRevokeButton.setEnabled(false);

        mStatus.setText(R.string.status_signed_out);
    }
}

解决方法

以正常方式连接您的MainActivity中的Googleapiclient,但是在onConnectionFailed中,而不是存储结果或解决错误,才能启用登录按钮.当用户点击它时,启动您的LoginActivity,它也应该实现Googleapiclient和相关的界面,并从中进行所有的ConnectionResult处理.

如果您创建一个执行您的活动实现的Googleapiclient设置的基础活动,您可能会更容易.在每个活动上启动Googleapiclient连接是完全正确的 – 它被设计为以这种方式使用.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...