如何检查用户是否使用FB SDK 4.0 for Android登录?

Fel*_*ipe 64 android facebook login facebook-graph-api

几天前我实现了FB登录到我的APP,今天我发现我已经实现的大部分内容现已弃用.

之前,我正在使用Session以查看用户是否已登录.但是,这不适用于新的SDK.

根据他们的文档,我们可以使用AccessToken.getCurrentAccessToken()Profile.getCurrentProfile()检查用户是否已经登录,但我无法使用它们.

我试过这样的事情:

if(AccessToken.getCurrentAccessToken() == null)
Run Code Online (Sandbox Code Playgroud)

我想知道如果我可以在其中使用它(这也是由FB提供),这是否会起作用:

LoginManager.getInstance().registerCallback(callbackManager, new LoginManager.Callback() {...});
Run Code Online (Sandbox Code Playgroud)

但是,我得到了"无法解析符号'回调'".

编辑!!!!!!

好的,所以我能够通过使用以下内容检查用户是否已登录:

on onCreate:

accessTokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
            updateWithToken(newAccessToken);
        }
    };
Run Code Online (Sandbox Code Playgroud)

然后,这会调用我的updateWithToken方法:

private void updateWithToken(AccessToken currentAccessToken) {
    if (currentAccessToken != null) {

            LOAD ACTIVITY A!

    } else {

            LOAD ACTIVITY B!
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,问题是:如果用户使用过该应用程序并且之前没有登录,我可以检查一下!但如果这是用户第一次使用该应用程序,updateWithToken则我的AccessTokenTracker永远不会调用它.

如果有人可以提供帮助,我真的很感激.

谢谢!

Fel*_*sso 137

一个更简单的解决方案适用于我的情况(我不知道这是否是更优雅的方式):

public boolean isLoggedIn() {
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    return accessToken != null;
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的解决方案.另外,我已经仔细检查过它是否已过期(`.isExpired()`). (8认同)
  • 这对我来说似乎不起作用 - 即使我登录时它也是"null". (8认同)
  • AccessToken.getCurrentAccessToken()有时为null的原因是onCurrentAccessTokenChanged被称为async.你必须第一次等待它.然后你可以使用AccessToken.getCurrentAccessToken() (2认同)

Fel*_*ipe 35

我知道了!

首先,确保已初始化FB SDK.其次,添加以下内容:

accessTokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
            updateWithToken(newAccessToken);
        }
    };
Run Code Online (Sandbox Code Playgroud)

当当前访问令牌发生变化时,将调用此方法.这意味着,这只会在用户已登录时帮助您.

接下来,我们将此添加到我们的onCreate()方法:

updateWithToken(AccessToken.getCurrentAccessToken());
Run Code Online (Sandbox Code Playgroud)

当然,我们的updateWithToken()方法:

private void updateWithToken(AccessToken currentAccessToken) {

    if (currentAccessToken != null) {
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                Intent i = new Intent(SplashScreen.this, GeekTrivia.class);
                startActivity(i);

                finish();
            }
        }, SPLASH_TIME_OUT);
    } else {
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                Intent i = new Intent(SplashScreen.this, Login.class);
                startActivity(i);

                finish();
            }
        }, SPLASH_TIME_OUT);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做对我来说!=]

  • 我使用不同的片段进行登录,并使用不同的片段进行发布,我想知道是否必须将访问令牌保存为全局状态. (2认同)

Ton*_*ony 9

我使用AccessToken和AccessTokenTracker检查登录状态的困境是,当AccessToken准备好并且跟踪器的回调函数被调用但配置文件可能还没有准备好时,因此我无法在此时获取或显示Facebooker的名称.

我的解决方案是检查当前配置文件!= null并使用其跟踪器同时拥有Facebooker的名称:

    ProfileTracker fbProfileTracker = new ProfileTracker() {
        @Override
        protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
            // User logged in or changed profile
        }
    };
Run Code Online (Sandbox Code Playgroud)

检查登录状态,然后获取用户名:

Profile profile = Profile.getCurrentProfile();
if (profile != null) {
    Log.v(TAG, "Logged, user name=" + profile.getFirstName() + " " + profile.getLastName());
}
Run Code Online (Sandbox Code Playgroud)