Google使用g-plus最新APIlogin并注销android

我已经经历了一些有关login和退出谷歌plus的stackoverflow问题。 而且大部分已经过时了。 我无法实现我真正想要的。

login后,下次login时,我希望用户select可用的Google帐户再次login。

我正在使用自定义login和注销button。 而为了退出,我有两个例子,

  1. 如果任何用户已经login了相同的login活动,请在login之前注销。
  2. 从不同的活动注销。

以下是我迄今为止所实施的内容:

public class LoginActivity extends AppCompatActivity implements OnClickListener{ private static final int RC_SIGN_IN = 9001; private GoogleApiClient mGoogleApiClient; private ConnectionResult mGoogleConnectionResult; private Button login; private ProgressDialog mProgressDialog; private Context mContext; private String mUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext= LoginActivity.this; requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.login_layout); login= (Button) findViewById(R.id.lg_login_btn); login.setOnClickListener(this); } @Override public void onClick(View v) { if(isOnline(mContext)){ if(v.getId()== R.id.lg_login_btn) { if(mGoogleApiClient!=null){ mGoogleApiClient.disconnect(); } GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.PLUS_LOGIN)) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(mContext.getApplicationContext()) .enableAutoManage(this , mGPlusConnectionFailedListener) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(Plus.API) .build(); signOutGPlus(); Intent lSignInIntent= Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(lSignInIntent, RC_SIGN_IN); } } else{ showAlertDialog(mContext, "Error", "Please check internet connection"); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); logD("&&onActivityResult", "requestCode: "+requestCode); // first if (requestCode == RC_SIGN_IN) { if(resultCode == RESULT_OK){ showProgressDialog(); getGPlusUserInfo(data); } else { logD("&&onActivityResult", "requestCode: RESULT_ NOT Ok"+requestCode); } } } GoogleApiClient.OnConnectionFailedListener mGPlusConnectionFailedListener= new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { logD("&&mGPlusConnectionFailedListener", "onConnectionFailed"); } }; private void getGPlusUserInfo(Intent data){ GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } private void handleSignInResult(GoogleSignInResult result) { Log.d("&&handleSignInResult", "handleSignInResult:" + result.isSuccess()); if (result.isSuccess()) { // Signed in successfully, show authenticated UI. String lDisplayName=""; String lEmail=""; String lFirstName=""; String lLastName=""; String lGender=""; // G+ if (mGoogleApiClient.hasConnectedApi(Plus.API)) { logD("&&GPlusUserInfo", "&hasConnectedApi--------------------------------"); // Deprecated Person person = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient); if(null != person) { logD("&&GPlusUserInfo", "&--------------------------------"); logD("&&GPlusUserInfo", "&Display Name: " + person.getDisplayName()); lDisplayName= person.getDisplayName(); logD("&&GPlusUserInfo", "Gender: " + person.getGender()); if(person.getGender()< MyHalConstants.GENDER.length){ lGender= MyHalConstants.GENDER[person.getGender()]; } else{ lGender= "Other"; } } } GoogleSignInAccount acct = result.getSignInAccount(); if(null != acct) { if (null != acct.getDisplayName()) { logD("&&GPlusUserInfo", "&Display Name: " + acct.getDisplayName()); } lFirstName= acct.getGivenName(); lLastName= acct.getFamilyName(); // Views inside NavigationView's header Uri uri = acct.getPhotoUrl(); } } else { // Signed out, show unauthenticated UI. signOutGPlus(); } } // sign - out private void signOutGPlus(){ logD("&&signOutGPlus", "signOutGPlus"); if(null != mGoogleApiClient){ mGoogleApiClient.connect(); mGoogleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(@Nullable Bundle bundle) { if(mGoogleApiClient.isConnected()) { logD("&&signOutGPlus", "inside"); Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(@NonNull Status status) { logD("&&signOutGPlus", "onResult"); if(mGoogleApiClient.isConnected()){ mGoogleApiClient.clearDefaultAccountAndReconnect(); mGoogleApiClient.disconnect(); } // Deprecated /*Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); //Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient); //revokeAccess();*/ } } ); } } @Override public void onConnectionSuspended(int i) { } }); } } // Not used private void revokeAccess() { logD("&&revokeAccess", "revokeAccess"); Auth.GoogleSignInApi.revokeAccess(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { // ... } }); } private void showProgressDialog() { if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage(getString(R.string.loading)); mProgressDialog.setIndeterminate(true); } mProgressDialog.show(); } private void hideProgressDialog() { if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.hide(); } } private void showAlertDialog(Context pContext, String pTitle, String pMessage){ AlertDialog.Builder ldialogBuilder= new AlertDialog.Builder(pContext); ldialogBuilder.setTitle(pTitle) .setMessage(pMessage) .setPositiveButton("Ok", null); ldialogBuilder.show(); } private void dismissDialog(){ if(null != mProgressDialog){ mProgressDialog.dismiss(); mProgressDialog= null; } } } 

至于从不同的活动注销,我遇到的答案都没有定义如何在新的活动中初始化mGoogleApiClient

如果我执行以下代码,请注销:

 private GoogleApiClient mGoogleApiClient; // sign - out private void signOutGPlusFromDifferentActivity(){ logD("&&signOutGPlus", "signOutGPlus"); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.PLUS_LOGIN)) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(mContext.getApplicationContext()) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addApi(Plus.API) .build(); if(null != mGoogleApiClient){ mGoogleApiClient.connect(); mGoogleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(@Nullable Bundle bundle) { if(mGoogleApiClient.isConnected()) { logD("&&signOutGPlus", "inside"); Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(@NonNull Status status) { logD("&&signOutGPlus", "onResult"); if(mGoogleApiClient.isConnected()){ mGoogleApiClient.clearDefaultAccountAndReconnect(); mGoogleApiClient.disconnect(); } } } ); } } @Override public void onConnectionSuspended(int i) { } }); } } 

它引发错误。

通过从login活动中删除注销部分,我可以从GPlus正确login。

摇篮:

 compile 'com.google.android.gms:play-services-auth:9.2.1' compile 'com.google.android.gms:play-services:9.2.1' 

注意:从login活动,我可以从谷歌加号或面子书login。

活动A(从g +或fblogin)。

login后,用户被引导到活动B,从活动B用户可以从适当的门户(g +或fb)注销。

Facebook部分完成。 剩下的只有g +。

请通过使用更新后的GOOGLE LOGIN LOGOUT API,协助您在这两种情况下正确退出login。

Solutions Collecting From Web of "Google使用g-plus最新APIlogin并注销android"

第二个活动中执行此操作。如果在第一个活动中保存有关login的任何首选项登出时单击清除它

 package com.ccc.bbbb; import com.google.android.gms.common.ConnectionResult; 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.common.api.ResultCallback; import com.google.android.gms.plus.People; import com.google.android.gms.plus.People.LoadPeopleResult; import com.google.android.gms.plus.Plus; //implement ConnectionCallbacks, OnConnectionFailedListener,ResultCallback<People.LoadPeopleResult> public class HomeActivity extends Activity implements OnClickListener ,ConnectionCallbacks, OnConnectionFailedListener, ResultCallback<People.LoadPeopleResult> { public static boolean isLogout=false; GoogleApiClient mGoogleApiClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this).addApi(Plus.API) .addScope(Plus.SCOPE_PLUS_LOGIN).build(); //Logout button click if(networkCheck.isNetworkAvailable(HomeActivity.this)) { Log.d(TAG, "logout if condition working...."); isLogout=true; if(mGoogleApiClient.isConnected()) { Plus.AccountApi.clearDefaultAccount(mGoogleApiClient); mGoogleApiClient.disconnect(); mGoogleApiClient.connect(); } Toast.makeText(HomeActivity.this, "you are logged out", Toast.LENGTH_SHORT).show(); Intent intent=new Intent(HomeActivity.this,MainActivity.class); startActivity(intent); finish(); } //override below methods and copy those codes @Override public void onResult(@NonNull LoadPeopleResult arg0) { // TODO Auto-generated method stub } @Override public void onConnectionFailed(@NonNull ConnectionResult arg0) { // TODO Auto-generated method stub } @Override public void onConnected(@Nullable 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(); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); mGoogleApiClient.connect(); } @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } if (mDialog.isShowing()) { mDialog.dismiss(); } } } 

login后,下次login时,我希望用户select可用的Google帐户再次login。

诀窍就是在用户点击Googleloginbuttonlogin后, 清除默认帐户重新连接GoogleApiClient这确保了当您点击loginbutton时,所有可用的Google帐户总是显示出来。

第1步:初始化GoogleAPIClient并将onClickListener设置为onCreate()中的googleSignInButton

 private GoogleApiClient mApiClient; private void initializeGoogleSignIn() { GoogleSignInOptions signInOptions = new GoogleSignInOptions .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestProfile() .build(); mApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this, this) .addApi(Auth.GOOGLE_SIGN_IN_API, signInOptions) .build(); SignInButton googleSignInButton = (SignInButton) findViewById(R.id.google_sign_in); googleSignInButton.setOnClickListener(this); } 

第2步:通过您的onClick()方法处理Googlelogin

 @Override public void onClick(View v) { switch (v.getId()) { case R.id.google_sign_in: if (mApiClient.isConnected()) { mApiClient.clearDefaultAccountAndReconnect(); } else { mApiClient.connect(); } Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mApiClient); startActivityForResult(signInIntent, RC_SIGN_IN); break; } } 

MISCALLANEOUS

 // Make sure you connect and disconnect the GoogleApiClient in onStart and onStop lifecycle methods @Override protected void onStart() { super.onStart(); mApiClient.connect(); } @Override protected void onStop() { super.onStop(); if (mApiClient.isConnected()) mApiClient.disconnect(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result != null && result.isSuccess()) { GoogleSignInAccount account = result.getSignInAccount(); setAppPreferenceData(account.getId(), account.getEmail(), String.valueOf(account.getPhotoUrl()), account.getDisplayName()); startActivity(new Intent(this, NavigationActivity.class)); finish(); } else { mProgressLayout.setVisibility(View.GONE); if (Utils.isNetworkAvailable(this)) Toast.makeText(this, "Google Authentication Failed! Please try again", Toast.LENGTH_SHORT).show(); else Toast.makeText(this, "Network Error! Please connect to your wifi.", Toast.LENGTH_LONG).show(); } } } 

为什么在代码中需要这么多的callback方法? 我想你有点复杂你的代码。 主要技巧是每当用户尝试login时断开和清除默认帐户,这确保他总是显示一个有效的谷歌帐户列表。 我已经使用相同的程序,它已经过尝试,testing和工作。

我的应用程序中使用的login状态只有一个callback方法。

 public class SignInActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener { } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Toast.makeText(SignInActivity.this, "Google Play connection error", Toast.LENGTH_SHORT).show(); mProgressLayout.setVisibility(View.GONE); } 

对于注销,您可以使用以下方法:

 private void signOut() { Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback( new ResultCallback<Status>() { @Override public void onResult(Status status) { Timber.d("Logged out"); } }); } 

为了login,您可以按照以下方法进行操作:

 public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { this.activity = activity; if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); } /*For inintializing googleapiclient*/ private void initGoogleClient() { gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); googleApiClient = new GoogleApiClient.Builder(activity) .enableAutoManage((FragmentActivity) activity /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .addOnConnectionFailedListener(this) .addApi(Plus.API) .addScope(new Scope(Scopes.PROFILE)) .build(); } private void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient); activity.startActivityForResult(signInIntent, RC_SIGN_IN); } 

login后,下次login时,我希望用户select可用的Google帐户再次login。

只要用户点击退出button,就可以注销用户并撤消访问权限。 下一次,当用户尝试login时,他/她将被要求select他们喜欢的谷歌帐户。

由于您正在login和退出不同的活动,所以最终会出现重复的代码。 不要复制代码,只需使用助手类并初始化Google SignIn Option和Google API Client。 现在,无论何时您想使用Google API Client,都可以初始化助手类。

情况1.如果您想在login前clearDefaultAccountAndReconnect ,请使用clearDefaultAccountAndReconnect

情况2.对于注销用户(不pipe活动是什么),使用Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback

这是项目的github链接 。 你可以看一下,如果你还有疑问。