安卓Facebook SDK 4 - 如何编程注销账户

118

最近,Facebook发布了新的、酷炫的SDK 4版本。我尝试切换到SDK4以使用新功能,但是在Facebook的登录功能上遇到了困难。

到目前为止,我使用以下代码来编写Facebook的注销功能:

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

但是SDK4似乎不再支持Session,而在官方文档中他们提到:

在Android上实现Facebook登录有两种方法:

LoginButton类 - 提供一个可以添加到您的UI中的按钮。它遵循当前访问令牌并可以登录和注销。

看起来似乎除了使用LoginButton,没有其他程序化注销Facebook的方法了。 如果有任何想法,请在这里分享。

6个回答

289
您可以使用LoginManager.getInstance().logOut();, 即使您使用LoginButton,因为该UI元素封装了LoginManager中可用的功能。 编辑: 仅提到此方法适用于Facebook SDK v4。我不知道他们将来是否会更改它。
如@as batoutofhell所提到的,请不要忘记添加FacebookSdk.sdkInitialize(getApplicationContext());以初始化Facebook SDK。有关详细信息,请参见此处

3
由于这是谷歌上排名最高的结果,我想提一下,当我尝试退出登录时,我的应用程序会崩溃,直到我先添加了以下这行代码:FacebookSdk.sdkInitialize(this.getApplicationContext()); LoginManager.getInstance().logOut(); - batoutofhell
7
注销后无法重新登录。在执行LoginManager.getInstance().logOut()之后,有没有任何方法可以重新登录? - AndroidDev
1
为什么我们需要调用FacebookSdk.sdkInitialize,因为它已经在onCreate中初始化了? - CoolMind
1
LoginManager.logOut() 我用过这个,它正常工作。 - Erum
1
@Erum 目前在 FB SDK v4.23.0 中不存在 LoginManager.logOut() 方法。 - Gem
显示剩余4条评论

68

如果您想完全脱离SDK4,请确保还将应用从用户的 Facebook 账户中移除。这种方法完全断开了用户的连接:

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

这意味着我必须删除Facebook应用程序和Facebook消息才能完成我的应用程序的注销吗? - mdtuyen
1
这个答案确保用户已经完全登出。为了百分之百地确定,需要包括FacebookSdk.sdkInitialize(getApplicationContext()); - Sandro Wiggers
.logOut()是做什么的?它是异步的吗?它会阻塞我的UI线程几毫秒吗?我认为.logOutAsync()更有意义。 - voghDev
1
@voghDev 的 onCompleted 方法不会回到 UI 线程,因此当您在那里调用 logOut 时它不会阻塞它。 - Frank
谢谢。这正是我正在寻找的。 - viper
显示剩余3条评论

9

2
如果您正在使用LoginManager,那么这是可行的。但是,如果您正在使用LoginButton,是否有一种编程方式可以注销? - Singed
我也想知道在使用LoginButton时如何注销。 - sarath
只需使用LoginButton,再次点击它,就可以注销。 - Beeing Jk

8

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

嗨,Stevie,当我按照你的答案调用logOut()方法时,它给了我一个错误:“java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0;”。它要求我在清单文件中添加权限。我该如何解决这个问题,因为我不想给出这个权限,因为注销应该是正常的过程。 - Kapil
@Aditya,这个App只需要网络权限。 <uses-permission android:name="android.permission.INTERNET" /> - tread
但是如果我不添加它,我会得到上述错误。如果可能的话,您能否分享一个具有自定义登录按钮和自定义注销按钮的 Facebook 示例? - Kapil
@Aditya 在这个例子中,我正在使用 Facebook 登录按钮。 - tread

5

您可以使用LoginManager注销,但您还必须使用图形请求。我正在谈论完全退出,这样下次您就可以使用不同的帐户登录。

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

通过使用共享首选项,您可以完全注销,下次您可以使用不同的帐户登录。

1

Frank版本的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()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接