适用于Android的Facebook SDK 4-如何以编程方式注销


112

最近,Facebook发布了SDK 4,其中包含新的更新。我试图切换到SDK4以使用新功能,但是,我在Facebook的登录功能方面苦苦挣扎。

到目前为止,以编程方式注销Facebook时,我使用了:

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

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

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

LoginButton类-提供可以添加到UI的按钮。它遵循当前的访问令牌,并且可以登录和注销人员。

好吧,除了使用LoginButton,似乎没有办法以编程方式注销Facebook。任何人都有任何想法,请在这里分享。

Answers:


276

LoginManager.getInstance().logOut();即使使用LoginButton 也可以使用,因为

此UI元素包装了LoginManager中可用的功能。

编辑: 只需提及这适用于Facebook SDK v4。我不知道他们将来是否会改变它。

@正如batoutofhell所提到的,不要忘FacebookSdk.sdkInitialize(getApplicationContext());了初始化Facebook sdk。详情请看这里


2
我想提一提,因为这是Google的最佳搜索结果,尝试注销之前我的应用程序崩溃了,直到我先添加以下代码行:FacebookSdk.sdkInitialize(this.getApplicationContext()); LoginManager.getInstance()。logOut();
batoutofhell

7
注销后,它将不允许我再次登录。我做了LoginManager.getInstance()。logOut();之后有什么办法可以再次登录?
AndroidDev

1
我们为什么要调用FacebookSdk.sdkInitialize,因为它已经在onCreate中进行了初始化?
CoolMind

1
我使用了LoginManager.logOut(),它可以正常工作
Erum

1
@Erum LoginManager.logOut()FB SDK v4.23.0中至今没有这样的方法
Gem

61

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

这正是我想要的!
Sash_KP '16

那意味着我必须删除Facebook App和Facebook消息才能完成我的应用程序的注销?
phongvan '16

1
此答案可确保用户完全注销。只是100%需要包含FacebookSdk.sdkInitialize(getApplicationContext());
Sandro Wiggers

在回调中,我还添加了@Override public void onCompleted(GraphResponse graphResponse){AccessToken.setCurrentAccessToken(null); LoginManager.getInstance()。logOut(); }
Sandro Wiggers '16

1
我相信@voghDev onCompleted不会再出现在UI线程上,因此当您在那里调用logOut时,它不会阻止它。
弗兰克(Frank)


7

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

嗨,史蒂夫,当我按照您在回答中提到的那样调用logOut()方法时,它给了我错误消息“ java.lang.SecurityException:权限被拒绝:用户的获取/设置设置要求以用户-2身份运行,但正在从用户处调用0;”。它要求我在清单文件中添加权限。我如何解决该问题,因为我不想授予此权限,因为注销应该是正常过程。
Aditya 2015年

@Aditya您只需要该应用程序的互联网许可。<uses-permission android:name="android.permission.INTERNET" />
斯蒂芬,2015年

但是,如果我不添加错误,我就会遇到错误。如果可能,您能否分享一个具有自定义登录按钮和自定义注销按钮的Facebook示例?
Aditya 2015年

@Aditya在此示例中,我正在使用Facebook登录按钮
stephen

4

您可以使用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

弗兰克版本科特林:

 fun disconnectFromFacebook() {
    if (AccessToken.getCurrentAccessToken() == null) {
        return  // already logged out
    }
    GraphRequest(
        AccessToken.getCurrentAccessToken(),
        "/me/permissions/",
        null,
        HttpMethod.DELETE,
        GraphRequest.Callback {
            LoginManager.getInstance().logOut()
        }).executeAsync()
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.