Выйти из google и facebook в приложении для Android

Я интегрировал регистрацию в Google и Facebook, используя соответствующие методы. Но после успешного подписания я хочу открыть другую активность, и точно так же пользователь может перейти к различным действиям. Я использовал панель действий, где я даю возможность выйти из любой учетной записи, в которую вошел пользователь. Как я могу выйти из пользователя, когда я занимаюсь другой деятельностью, а не основной деятельностью. Я получаю исключение и не могу передать ссылку apiclient (для google) и ссылку на сеанс (для facebook) другому действию. Пожалуйста помоги. Заранее спасибо.


person Jarvis    schedule 13.01.2015    source источник


Ответы (12)


Выйти из гугла:

Просто добавьте это в свою новую активность, где вы хотите, чтобы была кнопка выхода из Google+:

@Override
protected void onStart() {
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
    mGoogleApiClient.connect();
    super.onStart();
}

и затем вы можете установить setOnClickListener на кнопку:

signout.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
      Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
              new ResultCallback<Status>() {
                  @Override
                  public void onResult(Status status) {
                      // ...
                      Toast.makeText(getApplicationContext(),"Logged Out",Toast.LENGTH_SHORT).show();
                      Intent i=new Intent(getApplicationContext(),MainActivity.class);
                      startActivity(i);
                  }
              });
  }
});
person sommesh    schedule 16.08.2016
comment
просто. Я думал, что GoogleApiClient должен находиться в классе Application. поэтому его можно использовать во время выхода из системы. - person Rumit Patel; 19.06.2018

Для Facebook

LoginManager.getInstance().logOut();

Для Google

GoogleSignInOptions gso = new GoogleSignInOptions.
                    Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).
                    build();

            GoogleSignInClient googleSignInClient=GoogleSignIn.getClient(context,gso);
            googleSignInClient.signOut();
person Rehan Sarwar    schedule 05.03.2019

Выйти из фейсбука:

public static void callFacebookLogout(Context context) {
Session session = Session.getActiveSession();
if (session != null) {

    if (!session.isClosed()) {
        session.closeAndClearTokenInformation();
        //clear your preferences if saved
    }
} else  {

    session = new Session(context);
    Session.setActiveSession(session);

    session.closeAndClearTokenInformation();
        //clear your preferences if saved

 }

}

Выйти из гугла:

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

документы руководства

person Miki Franko    schedule 13.01.2015

Обновлено от 7 ноября 2017 г. Последний код для события входа и выхода

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestEmail()
                    .build();
    GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

Выход из Google

 mGoogleSignInClient.signOut()
                .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        // [START_EXCLUDE]
                        updateUI(null);
                        // [END_EXCLUDE]
                    }
                });

Google отозвать доступ

 mGoogleSignInClient.revokeAccess()
                .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        // [START_EXCLUDE]
                        updateUI(null);
                        // [END_EXCLUDE]
                    }
                });

См. код Google Здесь

Facebook Выход

LoginManager.getInstance().logOut();

См. документ Facebook здесь

person Prashant Arvind    schedule 31.12.2018

просто добавьте в свою новую деятельность это:

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

а потом

@Override
    public void onClick(View v)  {
            switch (v.getId()) {
                case R.id.sign_out_button2:

                        Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
                        mGoogleApiClient.disconnect();
                        mGoogleApiClient.connect();
person Andrey    schedule 30.03.2015
comment
Почему вы пишете mGoogleApiClient.connect(), а затем mGoogleApiClient.disconnect()? - person Poras Bhardwaj; 11.03.2016
comment
потому что он отключает все предыдущие сеансы - person Andrey; 10.07.2016

выйти из фейсбука довольно просто

просто добавьте следующий код

LoginManager.getInstance().logOut();

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

LoginManager.getInstance().logOut();
Intent intent = new Intent(CurrentActivity.this, LoginActivity.class);
startActivity(intent);
finish();

поэтому ваш окончательный код для logoutFromFacebook будет

public void logoutFromFacebook(){
    LoginManager.getInstance().logOut();
    Intent intent = new Intent(CurrentActivity.this, LoginActivity.class);
    startActivity(intent);
    finish();
}

Теперь просто вызовите этот метод в событии кнопки выхода из системы.

person kulbhushan jain    schedule 21.07.2016

Во-первых, для выхода из Facebook:

LoginManager.getInstance().logOut();

Если вы пытаетесь выйти из другого действия или фрагмента, это приведет к ошибке, например, Facebook SDK не инициализирован. Затем сначала вам нужно инициализировать facebook sdk, например:

FacebookSdk.sdkInitialize(your context here);

а затем выйти из менеджера.

Вторичный для выхода из Google:

сначала вы должны проверить, подключен ли клиент Google или нет, и если он подключен, то вызовите код выхода:

if (mGoogleApiClient.isConnected())
   Auth.GoogleSignInApi.signOut(mGoogleApiClient);

здесь mGoogleApiClient является объектом GoogleApiClient.

person Hani Ramani    schedule 27.09.2016

Для гугл-аккаунта

Auth.GoogleSignInApi.signOut(mGoogleApiClient);

и для аккаунта в фейсбуке

LoginManager.getInstance().logOut();
person tej shah    schedule 19.01.2017

Для выхода из Facebook.

public void logoutFromFacebook() {
        Session session = Session.getActiveSession();
        session.closeAndClearTokenInformation();
        // Clear Preferences and other data and go back to login activty
    }

Для выхода из Google+. Имейте в виду, что выход из Google+ немного сложнее, чем из Facebook. Вам нужно будет управлять логическим значением, чтобы отслеживать события при выходе из системы (так же, как вы делали это при входе в систему).

public void logoutFromGooglePlus() {
        mGooglePlusLogoutClicked = true;  // Keep track when you click logout
        if (mGoogleApiClient.isConnected()) {
            Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
            revokeAccess();
        } else {
            mGoogleApiClient.connect();   // It can send user to onConnected(), call logout again from there
        }
    }

// revoke access (if needed)
protected void revokeAccess() {

        Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
                .setResultCallback(new ResultCallback<Status>() {
                    @Override
                    public void onResult(Status status) {
                        mGoogleApiClient.disconnect();
                        mGoogleApiClient.connect();
                        // Clear data and go to login activity
                    }
                });
    }

Чтобы ответить на вопрос в комментарии: GoogleApiClient может быть создан много раз в приложении, и он по-прежнему принимает тот же экземпляр, который был инициализирован в первый раз. Так что не беспокойтесь о том, как «пропустить» GoogleApiClient между действиями. Это облегченный клиент, предназначенный для инициализации в качестве нового экземпляра в каждом действии. Просто создайте новый GoogleAPiClient, позвоните .connect() и начинайте работать. Однако вам придется реализовать необходимые для этого интерфейсы, но вы можете оставить методы пустыми, если вы не собираетесь выполнять там какую-либо работу.

Что касается mLogoutClicked логического значения, вы можете оставить свои собственная реализация по вашему желанию. По сути, это просто способ сообщить методу onConnected(), что вы пришли для выхода из системы. (посмотрите на код, мы также вызываем .connect() при выходе из системы. Таким образом, он может войти в onConnected() и столкнуться с вашим кодом входа). Вы бы сделали что-то подобное на своем onconnected()

public void onConnected(Bundle connectionHint) {

        if (mGooglePlusLogoutClicked) {
            logoutFromGooglePlus();
            mGooglePlusLogoutClicked = false;
        }
    }

В качестве совета по поводу вашего потока реализации сделайте так, чтобы базовый класс выполнял всю GoogleApiClient инициализацию и позволял действиям входа и другим действиям расширять его. Таким образом, он будет неявно решать проблему инициализации клиента в каждом действии. Просто внедрите общий код onConnected(), onConnectionFailed() и т. д. в базовую активность и позвольте активности входа переопределить их для реализации логики входа. (и то же самое для выхода из системы. Он переопределит их и обработает код выхода)

person VipulKumar    schedule 13.01.2015
comment
Как получить объект googleApiClient в другом действии. Также как должна поддерживаться переменная mGooglePlusLogoutClicked?. Спасибо за фейсбук, я смог это сделать, но, пожалуйста, помогите мне и с этим. - person Jarvis; 14.01.2015
comment
Я отредактировал ответ, чтобы включить подробности. Я упомянул рабочий процесс как можно яснее (насколько я о нем знаю). Надеюсь, поможет. Дайте мне знать. - person VipulKumar; 15.01.2015
comment
Мне нужна помощь в отношении входа в facebook с устройства Android. Я могу войти в систему с одного устройства, но с другого устройства это дает мне исключение при получении электронной почты и других вещей. Не могли бы вы помочь мне с этим? Я добавил разрешение на чтение электронной почты. - person Jarvis; 24.01.2015
comment
Используете ли вы одни и те же учетные записи Facebook на этих устройствах? Пожалуйста, задайте новый вопрос об этом и покажите код. - person VipulKumar; 27.01.2015

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

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(fromActivity.getString(R.string.default_web_client_id))
            .requestEmail()
            .requestProfile()
            .build();
    // Build a GoogleSignInClient with the options specified by gso.
    GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(fromActivity, gso);
    mGoogleSignInClient.signOut();
person Emanuele Fricano    schedule 10.11.2018

Самый простой способ выйти из аутентификации Google:

GoogleSignIn.getClient(getApplicationContext(), GoogleSignInOptions.DEFAULT_SIGN_IN).signOut();
person hiddeneyes02    schedule 17.09.2020

Вот вам и Google.

 Button login, signup, signout;
    GoogleSignInClient mGoogleSignInClient;
    private static final int RC_SIGN_IN = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        login = findViewById(R.id.login);
        signup = findViewById(R.id.signup);
        signout = findViewById(R.id.signout);
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();
        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
        signout.setOnClickListener(v -> mGoogleSignInClient.signOut()
                .addOnCompleteListener(this, task -> Log.e("checker", "Sign Out")));
        signup.setOnClickListener(v -> {
            Intent signInIntent = mGoogleSignInClient.getSignInIntent();
            startActivityForResult(signInIntent, RC_SIGN_IN);
        });

        login.setOnClickListener(v -> {
            GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
            if (account != null) {
                String personName = account.getDisplayName();
                String personEmail = account.getEmail();
                String personId = account.getId();
                Uri personPhoto = account.getPhotoUrl();
                Log.e("checker", personName);
                Log.e("checker", personId);
                Log.e("checker", String.valueOf(personPhoto));
                Log.e("checker", personEmail);
            } else
                Log.e("checker", "did not login");
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN) {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }
    }

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
            if (account != null) {
                String personName = account.getDisplayName();
                String personEmail = account.getEmail();
                String personId = account.getId();
                Uri personPhoto = account.getPhotoUrl();
                Log.e("checker", personName);
                Log.e("checker", personId);
                Log.e("checker", String.valueOf(personPhoto));
                Log.e("checker", personEmail);
            }
            else
                Log.e("checker", "Failed!");
        } catch (ApiException e) {
            Log.e("checker", "signInResult:failed code=" + e.getStatusCode());

        }
    }

Это для Фейсбука.

LoginManager.getInstance().logOut();
person ahmad bajwa    schedule 16.11.2020