Facebook SDK 4 para Android - como fazer logout programaticamente


112

Recentemente, o Facebook lançou o SDK 4 com atualizações novas e interessantes. Tentei mudar para o SDK4 para usar novos recursos, no entanto, estou lutando com o recurso Login do Facebook.

Até agora, para sair do Facebook de maneira programática, usei:

Session session = Session.getActiveSession();
session.closeAndClearTokenInformation();

Mas o SDK4 parece não oferecer mais suporte a Session e, em documentos oficiais, eles mencionam:

Existem duas maneiras de implementar o login do Facebook no Android:

Classe LoginButton - que fornece um botão que você pode adicionar à sua IU. Ele segue o token de acesso atual e pode fazer login e logout de pessoas.

Bem, parece que não há maneira de sair do Facebook programaticamente, exceto usando LoginButton. Alguém tem alguma ideia, por favor, compartilhe aqui.

Respostas:


276

Você pode usar LoginManager.getInstance().logOut();, mesmo se usar LoginButton porque

Este elemento de UI envolve a funcionalidade disponível no LoginManager.

EDIT: Só para mencionar que isso funciona para Facebook SDK v4 . Não sei se eles vão mudar isso no futuro.

@como batoutofhell, não esqueça de colocar FacebookSdk.sdkInitialize(getApplicationContext());pra inicializar o sdk do facebook. Por favor, veja aqui os detalhes.


2
Gostaria de mencionar, uma vez que este é o principal resultado do Google, meu aplicativo travou ao tentar sair até que eu adicionei esta linha primeiro: FacebookSdk.sdkInitialize (this.getApplicationContext ()); LoginManager.getInstance (). LogOut ();
batoutofhell

7
Após o logout, ele não me permitirá fazer o login novamente. Existe alguma maneira de fazer o login novamente depois de fazer LoginManager.getInstance (). LogOut ();
AndroidDev

1
Por que devemos chamar FacebookSdk.sdkInitialize, já que ele já foi inicializado em onCreate?
CoolMind

1
LoginManager.logOut () eu usei isso, funciona corretamente
Erum,

1
@Erum Não existe tal método LoginManager.logOut()no momento no FB SDK v4.23.0
Gem

61

SDK4, se você deseja desassociar completamente, certifique-se de remover também o aplicativo da conta do Facebook do usuário. Este método desconecta completamente o usuário:

public void disconnectFromFacebook() {

    if (AccessToken.getCurrentAccessToken() == null) {
        return; // already logged out
    }

    new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest
            .Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {

            LoginManager.getInstance().logOut();

        }
    }).executeAsync();
}

Isso é exatamente o que eu queria!
Sash_KP

Isso significa que devo remover o aplicativo do Facebook e a mensagem do Facebook para concluir o logout do meu aplicativo?
phongvan

1
Essa resposta garante que o usuário desconectou-se completamente. Para ser 100%, é necessário incluir FacebookSdk.sdkInitialize (getApplicationContext ());
Sandro Wiggers

No retorno de chamada, também adicionei @Override public void onCompleted (GraphResponse graphResponse) {AccessToken.setCurrentAccessToken (null); LoginManager.getInstance (). LogOut (); }
Sandro Wiggers

1
@voghDev onCompleted não volta no thread de IU, eu acredito, então ele não bloqueia quando você chama logOut lá.
Frank


7

Para lidar com isso com o loginButton:

//Check if user is currently logged in
        if (AccessToken.getCurrentAccessToken() != null && com.facebook.Profile.getCurrentProfile() != null){
            //Logged in so show the login button
            fbLogin.setVisibility(View.VISIBLE);
            fbLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
//log out
                    LoginManager.getInstance().logOut();
                    gotoLogin();
                }
            });
        }

Olá, Stevie, quando chamei o método logOut () como você mencionou em sua resposta, ele me deu o erro "java.lang.SecurityException: Permission Denial: get / set setting for user pede to run como user -2 mas está chamando de user 0; ". Ele está me pedindo para adicionar uma permissão no arquivo de manifesto. Como posso resolver isso porque não quero dar essa permissão, pois o logout deve ser o procedimento normal.
Aditya

@Aditya Você só precisa da permissão de internet para o aplicativo. <uses-permission android:name="android.permission.INTERNET" />
stephen

Mas estou recebendo acima do erro, se eu não adicioná-lo. Se possível, você pode compartilhar um exemplo do Facebook que tenha um botão de login personalizado e um botão de logout personalizado ??
Aditya

@Aditya, neste exemplo, estou usando o botão de login do Facebook
stephen

4

Você pode fazer logout usando LoginManager, mas também deve usar solicitação de gráfico. Estou falando em sair completamente para que da próxima vez você possa fazer o login com uma conta diferente.

new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest
            .Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {

            SharedPreferences pref = DashBoard.this.getPreferences(Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = pref.edit();
            editor.clear();
            editor.commit();
            LoginManager.getInstance().logOut();

            Intent logoutint = new Intent(DashBoard.this,MainActivity.class);
            logoutint.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
               startActivity(logoutint);

        }
    }).executeAsync();

Com a ajuda das preferências compartilhadas aqui, você pode se desconectar completamente e, da próxima vez, poderá fazer o login com uma conta diferente.


1

Frank version kotlin:

 fun disconnectFromFacebook() {
    if (AccessToken.getCurrentAccessToken() == null) {
        return  // already logged out
    }
    GraphRequest(
        AccessToken.getCurrentAccessToken(),
        "/me/permissions/",
        null,
        HttpMethod.DELETE,
        GraphRequest.Callback {
            LoginManager.getInstance().logOut()
        }).executeAsync()
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.