Android Facebook SDK:检查用户是否登录

Android Facebook SDK:检查用户是否登录,android,facebook,session,sdk,logout,Android,Facebook,Session,Sdk,Logout,我的Android应用程序上有一个功能,用户授权应用程序并共享链接 我还需要为用户提供一个退出facebook的选项,如果用户未登录int(或未授权应用程序),我需要有条件地禁用此按钮 我似乎找不到可以让我询问FB用户是否登录的API调用 我发现: 检索当前会话的过期时间(以毫秒为单位) 如果会话未过期或不存在,则为0 检查会话是否等于0是一种方法吗?还是我遗漏了什么?读者注意:这在新的FB 3.0 SDK中已被弃用 facebook.isSessionValid()如果用户登录,则返回true

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

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

我似乎找不到可以让我询问FB用户是否登录的API调用

我发现:

检索当前会话的过期时间(以毫秒为单位) 如果会话未过期或不存在,则为0


检查会话是否等于0是一种方法吗?还是我遗漏了什么?

读者注意:这在新的FB 3.0 SDK中已被弃用

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

Session.getActiveSession().isOpened()

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

1)使用
Session.isOpened()

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

还有另一种编写此函数的方法,详细介绍如下,但我不确定哪种方法更清晰或“最佳实践”

2)通过
Session.StatusCallback
UiLifecycleHelper

如果遵循此操作,您将设置
UiLifecycleHelper
,并在实例化时向其注册
会话.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
版本).

这似乎与新的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;
}

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

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

通过使用函数

boolean loggedIn;
//...
loggedIn = isFacebookLoggedIn();
//...
public boolean isFacebookLoggedIn(){
    return AccessToken.getCurrentAccessToken() != null;
}
查看此链接以获得更好的参考 也请选中此标题“访问令牌和配置文件”,它说“通过检查AccessToken.getCurrentAccessToken()和Profile.getCurrentProfile()Android Studio,您可以查看是否有人已登录,方法是:

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

我也有同样的问题。以下是我使用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();
    }
}

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

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

活动“onCreate”:

要检查会话是否仍然处于活动状态(我使用“onResume”方法创建了会话,但在需要时执行该操作):

diljeet的更多信息是正确的

此外,使用

返回AccessToken.getAccessToken()!=null和&Profile.getCurrentProfile()!=null;


它总是这样工作。

我使用FB sdk只是为了登录。。 Facebook开发者拒绝我的应用,因为无论何时用户登录,我都会发送注销。我不在乎用户档案数据…我只是使用FB登录。FB告诉用户如果用户登录…不要发送lgout

我发现黑客的方式。。。 现在我的应用程序不会在用户登录时发送注销…无论用户使用、谷歌、Facebook或普通登录…当他们单击注销…在这三种情况下 我用
LoginManager.getInstance().logOut();


无论他们使用哪个平台…都不会崩溃:)

你看过这个文档吗-?读者注意:这在新的FB 3.0 sdk中已被弃用。@Jesse我相信检查登录用户的新正确方法在我的答案中?在什么情况下你会使用openActiveSessionFromCacheyes,这个函数不起作用,新函数如何ons used?在不存在activeSession时抛出NPE。您应该首先使用if语句检查会话是否为空(如果为空,则我通常将其视为已关闭).在什么情况下您会使用openActiveSessionFromCache@MadhurAhuja我不是很确定。我没有太多地使用FB SDK,因为我只需要它的登录功能。我已经阅读并使用session.IsOpened()的第一个选项上的代码。现在我遇到了一个问题。如果facebook通过设备浏览器登录,效果会很好。但是当登录到facebook应用程序时。会话总是空的。有什么解决方法吗?这里有一个我问题的链接只是吹毛求疵,但是,为什么不只是
返回会话!=null&&session.isOpened()
isLoggedIn=state.isOpened()
@mr5很好的建议。我已经编辑了答案以简化代码。没有真正的理由我用另一种方法,只是当时我很容易遵循逻辑。不过我喜欢你的建议,效率更高。至于第二种方法/建议,我只想把它作为我的原始答案
private void updateWithToken(AccessToken currentAccessToken) {
    if (currentAccessToken != null) {
        fillUIWithFacebookInfos(handler);
    } else {
        login();
    }
}
facebookAccessToken = AccessToken.getCurrentAccessToken();
  if(facebookAccessToken != null){
        sessionExpired = facebookAccessToken.isExpired();
  }else{
        sessionExpired = true;
  }