Facebook AccessToken.getAccessToken имеет значение null при открытии приложения даже после первого входа
У меня встроен последний sdk для Android android (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, но он всегда приходит как null.
В любом случае, в новом sdk нет входа в фоновом режиме, поэтому мне не нужно просить пользователя войти в систему всегда, как раньше, в предыдущей версии в классе сеанса.
Ответы
Ответ 1
Маркер доступа, который был возвращен LoginManager, будет сохранен в общих настройках, поэтому при следующем открытии приложения AccessToken.getCurrentAccessToken() должен иметь тот же токен доступа, это то же самое, что и с сеансом класс. Вы можете проверить образцы, предоставленные с SDK, чтобы увидеть, как они работают.
Убедитесь, что вы не переустанавливаете приложение между сеансами или не устанавливаете токен текущего доступа в явном виде.
Ответ 2
Вы также можете добавить InitializeCallback в sdkInitialize и проверить 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");
}
}
});
Ответ 3
Инициализация sdk для Android Android занимает некоторое время. Инициализация.
поэтому вам нужно подождать всего 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);
Ответ 4
Добавьте следующий код:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
//super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode,resultCode,data);
}
Ответ 5
Я не тестировал это сам, но я думаю, что вы можете сделать это, чтобы получить AccessToken из объекта LoginResult в методе onSuccess обратного вызова.
Итак: AccessToken accessToken = loginResult.getAccessToken();
Затем вы сохраните этот accessToken, сказав:
AccessToken.setAccessToken(маркер доступа);
Затем, когда вы вызываете AccessToken.getAccessToken, он должен вернуть сохраненный вами доступ.
Ответ 6
Причина - кэширование профиля в формате SDK.
AccessToken.setCurrentAccessToken(null);
Profile.setCurrentProfile(null);
Прежде чем уничтожить активность, попробуйте. Возможно, это может решить вашу проблему. В первый раз работая, это чистый кэш во второй раз, когда вы можете войти в другую учетную запись.
Ответ 7
1.Используйте эту функцию для этой функции
public void onClickLogin() {
LoginManager.getInstance().logInWithReadPermissions(activity_name.this, PERMISSIONS);
}
Ответ 8
Шаги
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) убедитесь, что вы вызываете super.onActivityResult() в фрагменте с помощью менеджера обратного вызова Facebook.
2) проверьте, что super.onActivityResult() вызывается в связанной "активности фрагмента", если вы переопределяете onActivityResult в связанной деятельности.