Подтвердить что ты не робот

Android Facebook SDK: проверьте, вошел ли пользователь в систему или нет.

У меня есть функция в приложении для Android, где пользователь авторизует приложение и обменивается ссылкой.

Мне также нужно предоставить пользователю возможность выхода из системы facebook, и мне нужно условно отключить эту кнопку, если пользователь не занесен в систему (или не авторизован приложением).

Я не могу найти вызов API в Android SDK, который позволит мне спросить FB, если пользователь вошел в систему или нет.

Я нашел getAccessExpires():

Получить текущее время окончания сеанса (в миллисекундах с Unix epoch), или 0, если сеанс не истекает или не существует.

Будет ли проверять, будет ли сеанс равным 0? Или что-то мне не хватает?

4b9b3361

Ответ 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;
}