我已按照以下教程将Google+集成到Android应用中。 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/
我可以登录Google帐户,也可以检索信息。事情是我无法退出。
我在登录活动中登录G +并使用共享首选项存储会话,并在另一个Base活动中关闭会话,将布尔值传递给关闭会话的Login活动。虽然会话未激活或用户尚未登录,但只要登录活动开始,登录活动就会自动连接到G +。试图在onConnected上做逻辑但无济于事。
以下是我的代码段。
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
}
从基本活动注销会话的代码段
if (session.isLoggedIn()) {
session.logoutUser();
DataStore.LoginGoogle = false;
setOptionTitle(R.id.action_login, "Login");
}
答案 0 :(得分:4)
import com.google.android.gms.auth.api.Auth;
Auth.GoogleSignInApi.signOut(googleApiClient);
退出当前已登录的用户(如果有)。它还会清除用户先前选择的帐户,并且将来登录尝试将要求用户再次选择帐户。
注意 - googleApiClient
对象应处于已连接状态以退出用户。
答案 1 :(得分:2)
我找到了解决方案。
在引用以下网站后,我找到了解决方案。
Android implementing Google plus login error on mConnectionResult.hasResolution()
http://www.riskcompletefailure.com/2013/03/common-problems-with-google-sign-in-on.html
我必须检查onConnected中的日志记录会话,然后执行注销过程。 以下是代码段。
// 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);
}
}
}
答案 2 :(得分:0)
如果您仔细阅读了您提供的链接中的文档,您会看到有关如何注销使用的示例函数
@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
在"退出用户"
答案 3 :(得分:0)
我的代码的问题是在断开连接完成之前重新登录。解决方案是在断开连接完成后才开始重新登录,即在OnConnected
监听器中。