Android Facebook SDK: проверьте, вошел ли пользователь в систему или нет.
У меня есть функция в приложении для Android, где пользователь авторизует приложение и обменивается ссылкой.
Мне также нужно предоставить пользователю возможность выхода из системы facebook, и мне нужно условно отключить эту кнопку, если пользователь не занесен в систему (или не авторизован приложением).
Я не могу найти вызов API в Android SDK, который позволит мне спросить FB, если пользователь вошел в систему или нет.
Я нашел getAccessExpires()
:
Получить текущее время окончания сеанса (в миллисекундах с Unix epoch), или 0, если сеанс не истекает или не существует.
Будет ли проверять, будет ли сеанс равным 0? Или что-то мне не хватает?
Ответы
Ответ 1
Я изо всех сил пытался найти простой ответ на это в документах FB. Используя версию SDK версии 3.0, я думаю, есть два способа проверить, зарегистрирован ли пользователь.
1) Используйте Session.isOpened()
Чтобы использовать этот метод, вам нужно получить активный сеанс с getActiveSession()
, а затем (здесь запутанная часть) расшифровать, если сеанс находится в состоянии, в котором пользователь зарегистрирован или нет. Я думаю, что единственное, что важно для зарегистрированного пользователя, - это сеанс isOpened()
. Таким образом, если сеанс не является null
, и он открыт, то пользователь вошел в систему. Во всех остальных случаях пользователь выходит из системы (помните, что Session
может иметь состояния, отличные от открываемых и закрытых).
public boolean isLoggedIn() {
Session session = Session.getActiveSession();
return (session != null && session.isOpened());
}
Существует еще один способ написать эту функцию, подробно описанную в этом , но я не уверен, какой подход более ясен или "наилучшая практика".
2) Постоянно контролируйте изменения состояния с помощью Session.StatusCallback
и UiLifecycleHelper
Если вы выполните этот учебник, вы настроите UiLifecycleHelper
и зарегистрируете объект Session.StatusCallback
с ним при создании экземпляра. Там метод обратного вызова call()
, который вы переопределяете в Session.StatusCallback
, который предположительно будет вызываться в любое время, когда пользователь входит в систему. Внутри этого метода, возможно, вы можете отслеживать, вошел ли пользователь в систему или нет. Может быть, что-то вроде этого:
private boolean isLoggedIn = false; // by default assume not logged in
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (state.isOpened()) { //note: I think session.isOpened() is the same
isLoggedIn = true;
} else if (state.isClosed()) {
isLoggedIn = false;
}
}
};
public boolean isLoggedIn() {
return isLoggedIn;
}
Я думаю, что метод 1 проще и, вероятно, лучший выбор.
В качестве побочной заметки можно пролить свет на то, почему учебник любит называть state.isOpened()
вместо Session.isOpened()
, так как оба кажутся взаимозаменяемыми (Session.isOpened()
, похоже, просто вызывается в версию state
).
Ответ 2
Facebook версии SDK 4.x теперь имеют другой способ:
boolean loggedIn = AccessToken.getCurrentAccessToken() != null;
или
с помощью функций
boolean loggedIn;
//...
loggedIn = isFacebookLoggedIn();
//...
public boolean isFacebookLoggedIn(){
return AccessToken.getCurrentAccessToken() != null;
}
Проверьте эту ссылку для лучшей ссылки https://developers.facebook.com/docs/facebook-login/android
также проверьте этот заголовок " Токены и профайлы доступа", в котором говорится: "Вы можете видеть, был ли человек уже зарегистрирован, проверив AccessToken.getCurrentAccessToken() и Profile.getCurrentProfile()
Ответ 3
Примечание для читателей: Это теперь устарело в новом SDK FB 3.0.
facebook.isSessionValid()
возвращает true, если пользователь зарегистрирован, false, если нет.
Ответ 4
Session.getActiveSession().isOpened()
возвращает true, если пользователь зарегистрирован, false, если не
Ответ 5
Android Studio с:
compile 'com.facebook.android:facebook-android-sdk:4.0.1'
затем проверьте логин как:
private void facebookPost() {
//check login
AccessToken accessToken = AccessToken.getCurrentAccessToken();
if (accessToken == null) {
Log.d(TAG, ">>>" + "Signed Out");
} else {
Log.d(TAG, ">>>" + "Signed In");
}
}
Ответ 6
@diljeet был прав. fooobar.com/questions/159802/...
Кроме того, используйте
return AccessToken.getAccessToken() != null && Profile.getCurrentProfile()!=null;
Он всегда работает таким образом.
Ответ 7
У меня была такая же проблема. Вот мое решение, использующее SDK 4.0:
Прежде всего, в своей деятельности, связанной с проверкой входа в систему, обязательно вызовите это первичное:
FacebookSdk.sdkInitialize(this.getApplicationContext());
В вашем методе onCreate поместите это:
updateWithToken(AccessToken.getCurrentAccessToken());
new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
updateWithToken(newAccessToken, handler);
}
};
Затем добавьте метод:
private void updateWithToken(AccessToken currentAccessToken) {
if (currentAccessToken != null) {
fillUIWithFacebookInfos(handler);
} else {
login();
}
}
Этот способ будет обрабатывать уже зарегистрированного пользователя и недавно зарегистрированного пользователя.
Ответ 8
Для Android Android SDK 4.x вам нужно использовать "AccessToken.getCurrentAccessToken()", как сказал @Diljeet, но его проверка не сработала для меня, я, наконец, проверил его, выполнив:
Действие "onCreate":
facebookAccessToken = AccessToken.getCurrentAccessToken();
Чтобы проверить, активен ли сеанс (я сделал это в методе onResume, но сделайте это там, где вам нужно):
if(facebookAccessToken != null){
sessionExpired = facebookAccessToken.isExpired();
}else{
sessionExpired = true;
}
Дополнительная информация в https://developers.facebook.com/docs/facebook-login/android
Ответ 9
Кажется, что он хорошо работает с новым sdk.
private boolean isFacebookLoggedIn(){
Session session = Session.getActiveSession();
if (session != null) {
//Session can be open, check for valid token
if (!session.isClosed()) {
if(!session.getAccessToken().equalsIgnoreCase("")){
return true;
}
}
}
return false;
}