2012-09-13 138 views
34

我在Android应用中有一项功能,用户在该应用中授权应用并共享链接。Android Facebook SDK:检查用户是否已登录

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

我似乎无法找到Android SDK上的API调用,这会让我问FB是否用户登录。

我发现是getAccessExpires()

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

会检查会话是否等于0是要走的路?还是有我失踪的东西?

+1

你见过这个文档 - https://developers.facebook.com/docs/reference/androidsdk/authentication/? – deesarus

回答

48

我在努力寻找在FB文档一个简单的答案。使用3.0我认为有两种方法来检查用户是否登录Facebook的SDK版本。

1)使用Session.isOpened()

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

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

还有另外一种方式来写这个功能,在这个answer详细,但我不知道哪种方法更清晰或“最佳实践”。

2)不断地监视状态变更Session.StatusCallbackUiLifecycleHelper

如果按照这个tutorial你会设置的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; 
} 

我想办法更简单,可能是更好的选择。

作为一个侧面说明任何人都可以阐明为什么教程喜欢叫state.isOpened()而不是session.isOpened()因为两个光似乎是互换(session.isOpened()似乎刚刚经历反正打电话到state版)。

+0

在什么情况下你会使用openActiveSessionFromCache –

+0

@MadhurAhuja我不太确定。我还没有玩过FB SDK,因为我只是真的需要它的登录功能。 –

+0

我已阅读并使用session.IsOpened()第一个选项上的代码。现在我遇到了一个问题。如果Facebook通过设备的浏览器登录,这很有效。但是在Facebook应用上登录时。会话始终为空。有关如何解决这个问题的任何想法?这里是我的问题的链接http://stackoverflow.com/questions/22407482/facebook-login-via-app-vs-via-device-browser-in-android-app – ljpv14

6

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

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

+2

读者注意:现在在新的FB 3.0 sdk中不推荐使用。 @Jesse我相信新的正确方法来检查登录用户是在我的答案? –

+0

在什么情况下你会使用openActiveSessionFromCache –

+0

是的,这个函数不起作用,新函数是如何使用的? –

3
Session.getActiveSession().isOpened() 

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

+4

当没有activeSession存在时抛出NPE。 – Guy

+1

您应该首先使用if语句来检查会话是否为空(如果是的话我通常会像关闭一样处理它)。 – LoneDuck

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; 
} 
+0

或.isEmpty()可以工作。 – DeaMon1

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 检查这个标题太“Acce SS令牌和配置文件“它说:”你可以看到,如果一个人通过检查AccessToken.getCurrentAccessToken()和Profile.getCurrentProfile()

+1

它总是不断变化,让我们看看接下来会发生什么。 –

+4

我投票赞成,但显然,重新启动应用后,'getCurrentAccessToken()'仍然返回null,同时查看LoginButton:它说LogOut。我们在这里错过了什么? – CularBytes

+0

@RageCompex:好吧,它不应该返回null,这从来没有发生在我身上,也许你应该从你的应用程序设置启用“单点登录”和“深层链接”在developers.facebook.com 因此,你不必签署在一次又一次。 另请检查来自Facebook的登录指南的代码android sdk – Diljeet

3

Android的工作室已经登录:

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

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

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

活动:

1

对于您必须使用“AccessToken.getCurrentAccessToken()” Facebook的Android SDK中4.x版由@Diljeet说,但他的检查并没有为我工作,我终于做检查的话“的onCreate”:

facebookAccessToken = AccessToken.getCurrentAccessToken(); 

要检查会话是否仍然有效(我做到了在“的onResume”的方法,但做到这一点,你需要):

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

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

相关问题