即使在首次登录后,Facebook AccessToken.getAccessToken 在打开应用程序时仍为空
Facebook AccessToken.getAccessToken is null on opening of app even after first login
我集成了最新的 Facebook android sdk (Sdk 4.0)。
这是我在 onCreate 方法中添加的代码。
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
if(AccessToken.getCurrentAccessToken()!=null){
Log.d(FBTAG,"facebook already logged in");
isFBLogin = true;
}
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
Log.d(FBTAG,"facebook log in");
isFBLogin = true;
}
@Override
public void onCancel() {
// App code
isFBLogin = false;
}
@Override
public void onError(FacebookException error) {
isFBLogin = false;
Log.d(FBTAG,"facebook login error: "+error);
// App code
}
});
这是我用于 onClickLogin 的代码
public void onClickLogin() {
LoginManager.getInstance().logInWithPublishPermissions(this, PERMISSIONS);
}
我可以通过单击登录按钮并处理 onClickLogin 函数来登录。现在下次我打开应用程序时,我正在检查 AccessToken.getAccessToken 以检查用户是否已经在 facebook 上登录,但它始终为空。
无论如何,新的 sdk 中是否没有在后台登录,这样我就不必像以前在会话 class.
中那样总是要求用户登录
LoginManager 返回的访问令牌将保存在共享首选项中,因此下次打开应用程序时,AccessToken.getCurrentAccessToken() 应该具有相同的访问令牌,这与方法相同它与会话 class。您可以查看随 SDK 提供的示例以查看它们的工作情况。
确保您没有在会话之间重新安装应用程序,或将当前访问令牌明确设置为 null。
我自己没有对此进行测试,但我认为您可以做的是在回调的 onSuccess 方法中从 LoginResult 对象获取 AccessToken。
所以:AccessToken accessToken = loginResult.getAccessToken();
然后您可以通过以下方式保存此 accessToken:
AccessToken.setAccessToken(accessToken);
然后当你调用AccessToken.getAccessToken时,它应该return你保存的accessToken。
您还可以在 sdkInitialize 中添加 InitializeCallback 并检查回调中的 AccessToken:
FacebookSdk.sdkInitialize(getApplicationContext(), new FacebookSdk.InitializeCallback() {
@Override
public void onInitialized() {
if(AccessToken.getCurrentAccessToken() == null){
System.out.println("not logged in yet");
} else {
System.out.println("Logged in");
}
}
});
Android Facebook sdk 初始化需要一些时间初始化。
所以你只需要等待 100 毫秒就可以调用 AccessToken.getCurrentAccessToken()
一旦尝试了这个解决方案,它就对我有用了::
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (AccessToken.getCurrentAccessToken() != null) {
Log.d(FBTAG, "facebook already logged in");
isFBLogin = true;
}
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
Log.d(FBTAG, "facebook log in");
isFBLogin = true;
}
@Override
public void onCancel() {
// App code
isFBLogin = false;
}
@Override
public void onError(FacebookException error) {
isFBLogin = false;
Log.d(FBTAG, "facebook login error: " + error);
// App code
}
});
}
}, 100);
1.Change你的函数到这个函数
public void onClickLogin() {
LoginManager.getInstance().logInWithReadPermissions(activity_name.this, PERMISSIONS);
}
请添加以下代码:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
//super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode,resultCode,data);
}
步骤
1) FacebookSdk.sdkInitialize(getActivity().getApplicationContext());
2) CallbackManager mCallbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(mCallbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
//you will get access token here
mAccessToken = loginResult.getAccessToken();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException error) {
}
});
3)
//之后使用获取访问令牌
AccessToken mAccessToken=AccessToken.getCurrentAccessToken();
请确保,如果您使用片段中的 facebook 登录,
1) 确保使用 Facebook 回调管理器在片段中调用 super.onActivityResult()。
2) 如果您覆盖相关 activity.
中的 onActivityResult,请检查 super.onActivityResult() 在相关 "fragment activity" 中是否被调用
我集成了最新的 Facebook android sdk (Sdk 4.0)。 这是我在 onCreate 方法中添加的代码。
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
if(AccessToken.getCurrentAccessToken()!=null){
Log.d(FBTAG,"facebook already logged in");
isFBLogin = true;
}
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
Log.d(FBTAG,"facebook log in");
isFBLogin = true;
}
@Override
public void onCancel() {
// App code
isFBLogin = false;
}
@Override
public void onError(FacebookException error) {
isFBLogin = false;
Log.d(FBTAG,"facebook login error: "+error);
// App code
}
});
这是我用于 onClickLogin 的代码
public void onClickLogin() {
LoginManager.getInstance().logInWithPublishPermissions(this, PERMISSIONS);
}
我可以通过单击登录按钮并处理 onClickLogin 函数来登录。现在下次我打开应用程序时,我正在检查 AccessToken.getAccessToken 以检查用户是否已经在 facebook 上登录,但它始终为空。 无论如何,新的 sdk 中是否没有在后台登录,这样我就不必像以前在会话 class.
中那样总是要求用户登录LoginManager 返回的访问令牌将保存在共享首选项中,因此下次打开应用程序时,AccessToken.getCurrentAccessToken() 应该具有相同的访问令牌,这与方法相同它与会话 class。您可以查看随 SDK 提供的示例以查看它们的工作情况。
确保您没有在会话之间重新安装应用程序,或将当前访问令牌明确设置为 null。
我自己没有对此进行测试,但我认为您可以做的是在回调的 onSuccess 方法中从 LoginResult 对象获取 AccessToken。
所以:AccessToken accessToken = loginResult.getAccessToken();
然后您可以通过以下方式保存此 accessToken:
AccessToken.setAccessToken(accessToken);
然后当你调用AccessToken.getAccessToken时,它应该return你保存的accessToken。
您还可以在 sdkInitialize 中添加 InitializeCallback 并检查回调中的 AccessToken:
FacebookSdk.sdkInitialize(getApplicationContext(), new FacebookSdk.InitializeCallback() {
@Override
public void onInitialized() {
if(AccessToken.getCurrentAccessToken() == null){
System.out.println("not logged in yet");
} else {
System.out.println("Logged in");
}
}
});
Android Facebook sdk 初始化需要一些时间初始化。 所以你只需要等待 100 毫秒就可以调用 AccessToken.getCurrentAccessToken()
一旦尝试了这个解决方案,它就对我有用了::
FacebookSdk.sdkInitialize(this.getApplicationContext());
callbackManager = CallbackManager.Factory.create();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (AccessToken.getCurrentAccessToken() != null) {
Log.d(FBTAG, "facebook already logged in");
isFBLogin = true;
}
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
Log.d(FBTAG, "facebook log in");
isFBLogin = true;
}
@Override
public void onCancel() {
// App code
isFBLogin = false;
}
@Override
public void onError(FacebookException error) {
isFBLogin = false;
Log.d(FBTAG, "facebook login error: " + error);
// App code
}
});
}
}, 100);
1.Change你的函数到这个函数
public void onClickLogin() {
LoginManager.getInstance().logInWithReadPermissions(activity_name.this, PERMISSIONS);
}
请添加以下代码:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
//super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode,resultCode,data);
}
步骤
1) FacebookSdk.sdkInitialize(getActivity().getApplicationContext());
2) CallbackManager mCallbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(mCallbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
//you will get access token here
mAccessToken = loginResult.getAccessToken();
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException error) {
}
});
3) //之后使用获取访问令牌 AccessToken mAccessToken=AccessToken.getCurrentAccessToken();
请确保,如果您使用片段中的 facebook 登录,
1) 确保使用 Facebook 回调管理器在片段中调用 super.onActivityResult()。
2) 如果您覆盖相关 activity.
中的 onActivityResult,请检查 super.onActivityResult() 在相关 "fragment activity" 中是否被调用