Intereting Posts
Отправка html-адреса электронной почты в android с помощью <table> и т. Д. – действительно ли нет встроенного способа Intent? Исключение, возникшее во время TypedArray # getTextArray () Как добавить несколько виджетов в одном приложении? Изменение ориентации Android установил последнее модифицированное время для файла Каждая активность в Android – это процесс или одно приложение – это один процесс Осуществляет ли реализация SecureRandom Android истинное случайное число? Как читать данные из файла XLS (Excel) Android отправляет файл / данные из приложения через Bluetooth на ПК / принтер / сканер / другое устройство Как использовать кинжал в проекте библиотеки Android Правильное расширение LinearLayout для создания пользовательского представления SSLException, связанный с отправкой товара для услуги Amazon Можно ли уточнить использование <include> и <merge> Как открыть страницу Facebook Fan и проверить, понравилось ли пользователю Как сделать Android GridLayout совместимым с более старой версией?

Вход в систему Google и выход в систему Android с помощью g-plus новейшего API

Я рассмотрел некоторые из вопросов stackoverflow, связанных с входом и выходом из Google Plus. И большинство из них устарели. Я не могу достичь того, чего я действительно хочу.

Как только я выйду из системы, при следующем входе в систему я хочу, чтобы пользователь снова выбрал доступную учетную запись google для входа в систему.

Я использую пользовательскую кнопку входа и выхода. И для выхода я имею два случая,

  1. Выйдите из системы непосредственно перед входом в систему, если какой-либо пользователь уже выполнил вход в ту же учетную запись.
  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) { } }); } } 

Это вызывает ошибку.

Удалив часть входа из активности входа, я могу правильно войти в систему из GPlus.

Gradle:

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

ПРИМЕЧАНИЕ: из активности входа я могу войти в систему из Google + или face-book.

Активность A (Вход с g + или fb).

После входа в систему пользователь переходит к Activity B, из Activity B пользователь может выйти из соответствующего портала (g + или fb).

Facebook часть выполнена. Остается только g +.

Пожалуйста, помогите в подписании надлежащим образом в обоих случаях ПО ИСПОЛЬЗОВАНИЮ ОБНОВЛЕННЫХ API GOOGLE LOGIN LOGOUT.

Solutions Collecting From Web of "Вход в систему Google и выход в систему Android с помощью g-plus новейшего API"

Сделайте это во втором упражнении. Если вы сохраняете предпочтения в отношении входа в первую активность, тогда очистите его при выходе из системы

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

Как только я выйду из системы, при следующем входе в систему я хочу, чтобы пользователь снова выбрал доступную учетную запись google для входа в систему.

Хитрость заключается в том, чтобы clearDefaultAccountAndReconnect GoogleApiClient сразу после того, как пользователь нажимает кнопку входа в систему Google для входа в систему. Это гарантирует, что все доступные учетные записи Google всегда отображаются, когда вы нажимаете кнопку «Логин».

ШАГ 1: Инициализировать GoogleAPIClient и установить onClickListener в googleSignInButton в Activity onCreate ()

 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: Обращайтесь к Google Войти с помощью метода onClick ()

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

Зачем вам нужно много методов обратного вызова в вашем коде? Полагаю, вы немного усложнили свой код. Основной трюк заключается в отключении и очистке учетной записи по умолчанию всякий раз, когда пользователь пытается войти в систему, что гарантирует, что ему всегда показывают список действительных учетных записей google. Я использовал ту же процедуру, она опробована, протестирована и работает.

Только один метод обратного вызова для состояния входа, используемого в моем приложении.

 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"); } }); } 

Для входа вы можете следовать этим методам:

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

Как только я выйду из системы, при следующем входе в систему я хочу, чтобы пользователь снова выбрал доступную учетную запись google для входа в систему.

Просто выйдите из системы и отмените доступ, когда пользователь нажимает кнопку выхода. В следующий раз, когда пользователи попытаются войти в систему, ему будет предложено выбрать предпочитаемую учетную запись google.

Поскольку вы выполняете вход и выходите из разных видов деятельности, вы получаете дубликат кода. Вместо дублирования кода просто используйте вспомогательный класс и инициализируйте параметр Signin Google и клиент API Google. Теперь, когда вы хотите использовать Google API Client, вы можете инициализировать вспомогательный класс.

Случай 1. Если вы хотите выйти из системы перед clearDefaultAccountAndReconnect в систему, используйте clearDefaultAccountAndReconnect .

Случай 2. Для Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback пользователя (независимо от того, какой вид деятельности он имеет значение), используйте Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback .

Вот ссылка github на проект. Вы можете взглянуть, если у вас все еще есть сомнения.