Android Facebook SDK:检查用户是否登录
我的Android应用程序上有一个功能,用户授权应用程序并共享链接 我还需要为用户提供一个退出facebook的选项,如果用户未登录int(或未授权应用程序),我需要有条件地禁用此按钮 我似乎找不到可以让我询问FB用户是否登录的API调用 我发现: 检索当前会话的过期时间(以毫秒为单位) 如果会话未过期或不存在,则为0Android 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
检查会话是否等于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;
}