尝试检查用户是否已登录时无限循环.Google +

时间:2014-02-14 17:51:09

标签: android google-play-services

我正在尝试检查用户是否已登录并且是否天气,将其发送到登录或将其保留在主要活动上。

主要活动

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;

import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.plus.Plus;

public class MainActivity extends Activity {

    private GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Plus.API, null).addScope(Plus.SCOPE_PLUS_LOGIN).build();

        if (!mGoogleApiClient.isConnected()) {
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            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;
    }
}

LoginActivity

package com.alfalfa.thisthat;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

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;

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

    private static final int RC_SIGN_IN = 0;
    private GoogleApiClient mGoogleApiClient;
    private boolean mIntentInProgress;
    private boolean mSignInClicked;
    private static SignInButton mSignInButton;
    private ConnectionResult mConnectionResult;

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

        mSignInButton = (SignInButton) findViewById(R.id.sign_in_button);
        mSignInButton.setOnClickListener(this);
        mSignInButton.setEnabled(true);
        mSignInButton.setSize(SignInButton.SIZE_WIDE);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this).addApi(Plus.API, null)
                .addScope(Plus.SCOPE_PLUS_LOGIN).build();
    }

    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

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

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

    protected void onActivityResult(int requestCode, int responseCode,
            Intent intent) {
        if (requestCode == RC_SIGN_IN) {
            if (responseCode != RESULT_OK) {
                mSignInClicked = false;
            }

            mIntentInProgress = false;

            if (!mGoogleApiClient.isConnecting()) {
                mGoogleApiClient.connect();
            }
        }
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.sign_in_button
                && !mGoogleApiClient.isConnecting()) {
            mSignInClicked = true;
            resolveSignInErrors();
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        if (!mIntentInProgress) {
            mConnectionResult = result;

            if (mSignInClicked) {
                resolveSignInErrors();
            }
        }
    }

    private void resolveSignInErrors() {
        if (mConnectionResult.hasResolution()) {
            try {
                mIntentInProgress = true;
                mConnectionResult.startResolutionForResult(this, RC_SIGN_IN);
            } catch (SendIntentException e) {
                mIntentInProgress = false;
                mGoogleApiClient.connect();
            }
        }
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        mSignInClicked = false;
        navigateToMainActivity();
        Toast.makeText(this, "User is connected!", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onConnectionSuspended(int cause) {
        mGoogleApiClient.connect();
    }

    public void navigateToMainActivity() {
        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
        startActivity(intent);
    }
}

当我启动应用程序时,它会加载到登录屏幕。当我单击登录按钮时,应用程序将无限地返回和登录LoginActivity。

2 个答案:

答案 0 :(得分:1)

遗憾的是,我没有时间分析你的情况,但是我从我的应用程序中删除了一段代码,它做了类似的事情。它与Google Drive相关,但很容易适应 在菜单选择上,它弹出帐户选择器并使用所选帐户连接到GAC。我很快就删除了大量的代码,并希望我没有把它弄得太乱。 检查用户是否已登录与我的情况无关。如果之前连接了有效用户,则connect()成功,否则弹出帐户选择器。在SO 21610239中有更多关于它的内容。我相信没有办法获得当前签名的用户,除非您弹出帐户选择器并从退货处获取(下面的KEY_ACCOUNT_NAME)。

public class SomeActivity extends Activity
                                implements ConnectionCallbacks, OnConnectionFailedListener {
  GoogleApiClient mGAC;
  // from menu: user pops up account picker and selects account
  @Override public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.acc_select:
      Intent intent = AccountPicker.newChooseAccountIntent(null, null, 
              new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, false, null, null, null, null);
      startActivityForResult(intent, AUTH_REQUEST);
    return true;
    }
    return super.onOptionsItemSelected(item);
  }
  // back from account picker (invoked from menu OR from onConnectionFailed())
  @Override protected void onActivityResult(final int rqst, final int rslt, final Intent it) { 
    switch (rqst) {
    case AUTH_REQUEST:                                    
      if (mGAC == null) {
        mGAC = new GoogleApiClient.Builder(this).addApi(Drive.API).addScope(Drive.SCOPE_FILE)
        .setAccountName(it.getStringExtra(AccountManager.KEY_ACCOUNT_NAME))
        .addConnectionCallbacks(this).addOnConnectionFailedListener(this).build();
      }
      if ((mGAC != null) && !mGAC.isConnected())
        mGAC.connect();
      break;
    }
  }
  // connection failed, either fatal, or needs account / authorization
  @Override public void onConnectionFailed(ConnectionResult rslt) {
    if (!rslt.hasResolution()) {        // FATAL ------->>>>
      Toast.makeText(this, "FAILED", Toast.LENGTH_LONG).show();
    } else try {                     // needs authorization
      rslt.startResolutionForResult(this, AUTH_REQUEST);
    } catch (SendIntentException e) {}
  }
  @Override public void onConnected(Bundle connectionHint) {
    // do my stuff here
  }
  @Override public void onConnectionSuspended(int i) {}
}

答案 1 :(得分:0)

我在您发布的代码中看到了一个明显的问题:

   mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Plus.API, null).addScope(Plus.SCOPE_PLUS_LOGIN).build();

    if (!mGoogleApiClient.isConnected()) {
        Intent intent = new Intent(MainActivity.this, LoginActivity.class);
        startActivity(intent);
    }

此时mGoogleApiClient永远不会被连接。要确定用户是否未成功连接(可能会出现多种原因),您需要向OnConnectionFailedListener添加Builder,然后在{{.connect()上调用mGoogleApiClient 1}}并等待OnConnectionFailedListener#onConnectionFailed()被调用。如果发生这种情况,请将用户重定向回登录活动。