34

我的 Android 应用程序上有一个功能,用户授权该应用程序并共享链接。

我还需要为用户提供注销 facebook 的选项,如果用户未登录(或未授权应用程序),我需要有条件地禁用此按钮。

我似乎无法在Android SDK上找到可以让我询问 FB 用户是否登录的 API 调用。

我发现的是getAccessExpires()

检索当前会话的过期时间(自 Unix 纪元以来的毫秒数),如果会话未过期或不存在,则为 0。

检查会话是否等于0是要走的路吗?还是我缺少什么?

4

10 回答 10

54

Facebook SDK 4.x 版本现在有不同的方法:

boolean loggedIn = AccessToken.getCurrentAccessToken() != null;

或者

通过使用函数

boolean loggedIn;
//...
loggedIn = isFacebookLoggedIn();
//...
public boolean isFacebookLoggedIn(){
    return AccessToken.getCurrentAccessToken() != null;
}

检查此链接以获得更好的参考https://developers.facebook.com/docs/facebook-login/android 也检查此标题“访问令牌和配置文件”它说“您可以通过检查 AccessToken 来查看一个人是否已经登录。 getCurrentAccessToken() 和 Profile.getCurrentProfile()

于 2015-03-31T18:36:21.113 回答
48

我很难在 FB 文档中找到一个简单的答案。使用 Facebook SDK 3.0 版我认为有两种方法可以检查用户是否已登录。

1) 使用Session.isOpened()

要使用此方法,您需要检索活动会话,getActiveSession()然后(这是令人困惑的部分)解密会话是否处于用户登录的状态。我认为对于登录用户来说唯一重要的是会话是否isOpened(). 因此,如果会话不是null并且它是打开的,则用户已登录。在所有其他情况下,用户已注销(请记住,Session可以有除了打开和关闭之外的状态)。

public boolean isLoggedIn() {
    Session session = Session.getActiveSession();
    return (session != null && session.isOpened());
}

还有另一种编写此函数的方法,详见此答案,但我不确定哪种方法更清晰或“最佳实践”。

Session.StatusCallback2) 使用和持续监控状态变化UiLifecycleHelper

如果您遵循本教程,您将在实例化时设置UiLifecycleHelper并注册一个Session.StatusCallback对象。有一个回调方法 ,call()您可以在其中覆盖Session.StatusCallback它,据说只要用户登录/注销就会调用它。在该方法中,您可能可以跟踪用户是否已登录。也许是这样的:

private boolean isLoggedIn = false; // by default assume not logged in

private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) { //note: I think session.isOpened() is the same
            isLoggedIn = true;
        } else if (state.isClosed()) {
            isLoggedIn = false;
        }
    }
};

public boolean isLoggedIn() {
    return isLoggedIn;
}

我认为方法1更简单,可能是更好的选择。

作为旁注,任何人都可以阐明为什么教程喜欢调用state.isOpened()而不是session.isOpened()因为两者似乎是可以互换的(无论如何session.isOpened()似乎只是调用版本)。state

于 2013-06-19T20:58:33.220 回答
6

读者注意:现在在新的 FB 3.0 SDK 中已弃用。

facebook.isSessionValid()如果用户已登录,则返回 true,否则返回 false。

于 2012-09-13T21:31:28.707 回答
3
Session.getActiveSession().isOpened()

如果用户已登录,则返回 true,否则返回 false

于 2013-05-28T03:24:46.047 回答
3

安卓工作室:

compile 'com.facebook.android:facebook-android-sdk:4.0.1'

然后检查登录,如下所示:

private void facebookPost() {
    //check login
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    if (accessToken == null) {
        Log.d(TAG, ">>>" + "Signed Out");
    } else {
        Log.d(TAG, ">>>" + "Signed In");
    }
}
于 2015-04-29T06:38:12.973 回答
2

@diljeet 是对的。https://stackoverflow.com/a/29375963/859330

此外,使用

return AccessToken.getAccessToken() != null && Profile.getCurrentProfile()!=null;

它总是以这种方式工作。

于 2016-07-19T19:38:36.257 回答
1

对于 Facebook Android SDK 4.x,您必须使用 @Diljeet 所说的“AccessToken.getCurrentAccessToken()”,但他的检查对我不起作用,我终于通过以下方式检查了它:

活动“onCreate”:

facebookAccessToken = AccessToken.getCurrentAccessToken();

检查会话是否仍处于活动状态(我在“onResume”方法中创建了它,但在您需要的地方进行):

  if(facebookAccessToken != null){
        sessionExpired = facebookAccessToken.isExpired();
  }else{
        sessionExpired = true;
  }

更多信息在https://developers.facebook.com/docs/facebook-login/android

于 2015-11-18T12:44:25.263 回答
0

这似乎与新的 sdk 配合得很好。

private boolean isFacebookLoggedIn(){
    Session session = Session.getActiveSession();

    if (session != null) {
        //Session can be open, check for valid token
        if (!session.isClosed()) {
            if(!session.getAccessToken().equalsIgnoreCase("")){
                return true;
            }
        }
    }
    return false;
}
于 2014-07-02T16:33:49.970 回答
0

我遇到过同样的问题。这是我使用 SDK 4.0 的解决方案:

首先,在你处理登录检查的活动中,一定要调用这个主要的:

        FacebookSdk.sdkInitialize(this.getApplicationContext());

在你的 onCreate 方法中放这个:

updateWithToken(AccessToken.getCurrentAccessToken());

    new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
            updateWithToken(newAccessToken, handler);
        }
    };

然后添加调用的方法:

private void updateWithToken(AccessToken currentAccessToken) {
    if (currentAccessToken != null) {
        fillUIWithFacebookInfos(handler);
    } else {
        login();
    }
}

这种方式将处理已经登录的用户和新登录的用户。

于 2015-08-24T09:41:30.737 回答
0

我使用 FB sdk 仅用于登录.. Facebook 开发人员拒绝我的应用程序,因为每当用户登录时,我都会发送注销.. 我不关心用户个人资料数据......我只是使用 FB 登录.. FB 告诉用户是否登录。 ..不要发送lgout ...

我发现黑客方式......现在我的应用程序不会在用户登录时发送注销......无论用户登录,谷歌,Facebook还是正常......当他们点击注销......在这三种情况下我使用 LoginManager.getInstance().logOut();

无论他们使用哪个平台......都没有崩溃:)

于 2020-03-24T13:55:22.270 回答