在应用开始时,我需要知道用户是否已登录才能显示登录页面。
我的第一次尝试是致电AccessToken.getCurrentAccessToken()
,但这不起作用,请参阅https://stackoverflow.com/a/29854249/1016472
我的第二次尝试是使用AccessTokenTracker,但这也不起作用。要使用AccessTokenTracker,我必须首先初始化Facebook SDK。但在此初始化期间,访问令牌被发送到跟踪器。目前尚未创建跟踪器且无法接收令牌。
我的第三次尝试是创建我自己的AccessTokenTracker,看起来像原始的。我在初始化SDK之前创建并注册了它。现在,我的跟踪器在SDK初始化过程中获得了令牌。
凭借这些知识,我打开bug report at Facebook的问题:
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);
}
};
答案 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();让你当前获得成功