Подтвердить что ты не робот

Google входит в систему и выходит из системы Android с использованием новейшего API g-plus

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

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

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

  • перед тем, как войти в систему, если какой-либо пользователь уже выполнил вход в ту же учетную запись.
  • выход из другой активности.

Вот что я реализовал до сих пор:

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 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 + или facebook.

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

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

Facebook часть завершено. Остается только g +.

Пожалуйста, помогите в подписании надлежащим образом в обоих случаях. ИСПОЛЬЗУЯ ОБНОВЛЕНО API-интерфейсы LOGOG LOGO LOGOUT.

4b9b3361

Ответ 1

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

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

         }




}

Ответ 2

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

Ответ 3

Для выхода вы можете использовать следующий метод:

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

Ответ 4

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

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

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

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

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

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