如何在应用启动时获取当前的Facebook访问令牌?

时间:2015-05-21 16:39:44

标签: android facebook facebook-android-sdk facebook-access-token

在应用开始时,我需要知道用户是否已登录才能显示登录页面。

我的第一次尝试是致电AccessToken.getCurrentAccessToken(),但这不起作用,请参阅https://stackoverflow.com/a/29854249/1016472

我的第二次尝试是使用AccessTokenTracker,但这也不起作用。要使用AccessTokenTracker,我必须首先初始化Facebook SDK。但在此初始化期间,访问令牌被发送到跟踪器。目前尚未创建跟踪器且无法接收令牌。

我的第三次尝试是创建我自己的AccessTokenTracker,看起来像原始的。我在初始化SDK之前创建并注册了它。现在,我的跟踪器在SDK初始化过程中获得了令牌。

凭借这些知识,我打开bug report at Facebook的问题:

  • 为什么AccessTokenTracker依赖于初始化的SDK。我认为 这是一个错误。
  • 查看用户是否已登录的正确方法是什么 是否在应用开始。

Facebook的答案:

  

这看起来不像bug。 AccessTokenTracker   :: onCurrentAccessTokenChanged应该让你知道什么时候有   收到了一个令牌。

我知道这不起作用。现在我知道没有错误。

但是如何解决我的问题呢?

这不起作用:

FacebookSdk.sdkInitialize(getApplicationContext());
mAccessTokenTracker = new AccessTokenTracker() {

    @Override
    protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {

        Timber.i("AccessTokenTracker oldAccessToken: " + oldAccessToken + " - currentAccessToken: " + currentAccessToken);
    }
};

6 个答案:

答案 0 :(得分:5)

如您所说,您需要首先初始化SDK。然后创建访问令牌跟踪器,然后通过AccessToken.getCurrentAccessToken()检查当前访问令牌。

如果SDK初始化程序足够快以至于在您创建跟踪器之前设置了令牌,那么您对currentAccessToken的调用将获得该令牌。如果sdk初始化比跟踪器注册慢,那么跟踪器将获得访问令牌。

答案 1 :(得分:2)

一定是这样(这个Facebook v4.1.2)

FacebookSdk.sdkInitialize(getApplicationContext());

mFacebookCallbackManager = CallbackManager.Factory.create();

mFacebookAccessTokenTracker = new AccessTokenTracker() {
    @Override
    protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
        ...
    }
};

mFacebookLoginButton = new LoginButton(this);
mFacebookLoginButton.setReadPermissions(Arrays.asList("public_profile", "email", "user_birthday"));
mFacebookLoginButton.registerCallback(mFacebookCallbackManager, new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {
        ...
        String token = loginResult.getAccessToken().getToken()
        ...
    }

    @Override
    public void onCancel() {
        Lo.d("Facebook login - the user did not give permission");
    }

    @Override
    public void onError(FacebookException e) {
        e.printStackTrace();
    }
});

答案 2 :(得分:2)

@Gokhan Caglar是对的,如果Facebook Sdk未完成初始化,则访问令牌为空。那么这个怎么样?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(this /* applicationContext */);
    setContentView(R.layout.activity_getting_started);

    callbackManager = CallbackManager.Factory.create();

    if (AccessToken.getCurrentAccessToken() == null) {
        waitForFacebookSdk();
    } else {
        init();
    }
}

private void waitForFacebookSdk() {
    AsyncTask asyncTask = new AsyncTask() {
        @Override
        protected Object doInBackground(Object[] params) {
            int tries = 0;
            while (tries < 3) {
                if (AccessToken.getCurrentAccessToken() == null) {
                    tries++;
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    return null;
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(Object result) {
            init();
        }
    };
    asyncTask.execute();
}

private void init() {
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    if (accessToken == null || accessToken.isExpired()) {
        // do work
    } else {
        // do some other work
    }
}

不是我眼中最好的解决方案,但等待Facebook Sdk可能有所帮助。

答案 3 :(得分:0)

在Intializer.java应用程序中初始化Facebook SDK,以便在初始化后执行活动中的任何代码。将初始化程序添加到清单文件

答案 4 :(得分:-3)

如果您是登录,那么您可以写 AccessToken.getCurrentAccessToken(); 获取当前的访问令牌

答案 5 :(得分:-4)

如果您是登录,那么您可以写:AccessToken.getCurrentAccessToken();让你当前获得成功