我的 Android 应用程序上有一个功能,用户授权该应用程序并共享链接。
我还需要为用户提供注销 facebook 的选项,如果用户未登录(或未授权应用程序),我需要有条件地禁用此按钮。
我似乎无法在Android SDK上找到可以让我询问 FB 用户是否登录的 API 调用。
我发现的是getAccessExpires()
:
检索当前会话的过期时间(自 Unix 纪元以来的毫秒数),如果会话未过期或不存在,则为 0。
检查会话是否等于0是要走的路吗?还是我缺少什么?
我的 Android 应用程序上有一个功能,用户授权该应用程序并共享链接。
我还需要为用户提供注销 facebook 的选项,如果用户未登录(或未授权应用程序),我需要有条件地禁用此按钮。
我似乎无法在Android SDK上找到可以让我询问 FB 用户是否登录的 API 调用。
我发现的是getAccessExpires()
:
检索当前会话的过期时间(自 Unix 纪元以来的毫秒数),如果会话未过期或不存在,则为 0。
检查会话是否等于0是要走的路吗?还是我缺少什么?
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()
我很难在 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.StatusCallback
2) 使用和持续监控状态变化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
读者注意:现在在新的 FB 3.0 SDK 中已弃用。
facebook.isSessionValid()
如果用户已登录,则返回 true,否则返回 false。
Session.getActiveSession().isOpened()
如果用户已登录,则返回 true,否则返回 false
安卓工作室:
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");
}
}
@diljeet 是对的。https://stackoverflow.com/a/29375963/859330
此外,使用
return AccessToken.getAccessToken() != null && Profile.getCurrentProfile()!=null;
它总是以这种方式工作。
对于 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
这似乎与新的 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;
}
我遇到过同样的问题。这是我使用 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();
}
}
这种方式将处理已经登录的用户和新登录的用户。
我使用 FB sdk 仅用于登录.. Facebook 开发人员拒绝我的应用程序,因为每当用户登录时,我都会发送注销.. 我不关心用户个人资料数据......我只是使用 FB 登录.. FB 告诉用户是否登录。 ..不要发送lgout ...
我发现黑客方式......现在我的应用程序不会在用户登录时发送注销......无论用户登录,谷歌,Facebook还是正常......当他们点击注销......在这三种情况下我使用
LoginManager.getInstance().logOut();
无论他们使用哪个平台......都没有崩溃:)