2012-09-13 220 views
34

我在Android應用中有一項功能,用戶在該應用中授權應用並共享鏈接。Android Facebook SDK:檢查用戶是否已登錄

我還需要給用戶註銷facebook的選項,如果用戶沒有登錄int(或未授權應用程序),我需要有條件地禁用此按鈕。

我似乎無法找到Android SDK上的API調用,這會讓我問FB是否用戶登錄。

我發現是getAccessExpires()

檢索當前會話的到期時間(以毫秒爲單位自 Unix紀元),或0,如果會話不會過期或不存在。

會檢查會話是否等於0是要走的路?還是有我失蹤的東西?

+1

你見過這個文檔 - https://developers.facebook.com/docs/reference/androidsdk/authentication/? – deesarus

回答

48

我在努力尋找在FB文檔一個簡單的答案。使用3.0我認爲有兩種方法來檢查用戶是否登錄Facebook的SDK版本。

1)使用Session.isOpened()

要使用這個方法,你需要與getActiveSession(),然後檢索活動會議(這裏是令人困惑的部分)解密,如果會話處於用戶登錄狀態。我認爲對於登錄用戶唯一重要的是會話isOpened()。因此,如果會話不是null並且它是開放的,那麼用戶已登錄。在所有其他情況下,用戶已註銷(請記住,Session可以具有除打開和關閉以外的其他狀態)。

public boolean isLoggedIn() { 
    Session session = Session.getActiveSession(); 
    return (session != null && session.isOpened()); 
} 

還有另外一種方式來寫這個功能,在這個answer詳細,但我不知道哪種方法更清晰或「最佳實踐」。

2)不斷地監視狀態變更Session.StatusCallbackUiLifecycleHelper

如果按照這個tutorial你會設置的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; 
} 

我想辦法更簡單,可能是更好的選擇。

作爲一個側面說明任何人都可以闡明爲什麼教程喜歡叫state.isOpened()而不是session.isOpened()因爲兩個光似乎是互換(session.isOpened()似乎剛剛經歷反正打電話到state版)。

+0

在什麼情況下你會使用openActiveSessionFromCache –

+0

@MadhurAhuja我不太確定。我還沒有玩過FB SDK,因爲我只是真的需要它的登錄功能。 –

+0

我已閱讀並使用session.IsOpened()第一個選項上的代碼。現在我遇到了一個問題。如果Facebook通過設備的瀏覽器登錄,這很有效。但是在Facebook應用上登錄時。會話始終爲空。有關如何解決這個問題的任何想法?這裏是我的問題的鏈接http://stackoverflow.com/questions/22407482/facebook-login-via-app-vs-via-device-browser-in-android-app – ljpv14

6

讀者注意:現在在新的FB 3.0 SDK中已棄用此功能。

facebook.isSessionValid()如果用戶登錄則返回true,否則返回false。

+2

讀者注意:現在在新的FB 3.0 sdk中不推薦使用。 @Jesse我相信新的正確方法來檢查登錄用戶是在我的答案? –

+0

在什麼情況下你會使用openActiveSessionFromCache –

+0

是的,這個函數不起作用,新函數是如何使用的? –

3
Session.getActiveSession().isOpened() 

返回true,如果用戶已登錄,否則爲false

+4

當沒有activeSession存在時拋出NPE。 – Guy

+1

您應該首先使用if語句來檢查會話是否爲空(如果是的話我通常會像關閉一樣處理它)。 – LoneDuck

0

這似乎與新的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; 
} 
+0

或.isEmpty()可以工作。 – DeaMon1

54

的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 檢查這個標題太「Acce SS令牌和配置文件「它說:」你可以看到,如果一個人通過檢查AccessToken.getCurrentAccessToken()和Profile.getCurrentProfile()

+1

它總是不斷變化,讓我們看看接下來會發生什麼。 –

+4

我投票贊成,但顯然,重新啓動應用後,'getCurrentAccessToken()'仍然返回null,同時查看LoginButton:它說LogOut。我們在這裏錯過了什麼? – CularBytes

+0

@RageCompex:好吧,它不應該返回null,這從來沒有發生在我身上,也許你應該從你的應用程序設置啓用「單點登錄」和「深層鏈接」在developers.facebook.com 因此,你不必簽署在一次又一次。 另請檢查來自Facebook的登錄指南的代碼android sdk – Diljeet

3

Android的工作室已經登錄:

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"); 
    } 
} 
1

我有同樣的問題。下面是一個使用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(); 
    } 
} 

這種方式將處理已經登錄使用r和新登錄的用戶。

活動:

1

對於您必須使用「AccessToken.getCurrentAccessToken()」 Facebook的Android SDK中4.x版由@Diljeet說,但他的檢查並沒有爲我工作,我終於做檢查的話「的onCreate」:

facebookAccessToken = AccessToken.getCurrentAccessToken(); 

要檢查會話是否仍然有效(我做到了在「的onResume」的方法,但做到這一點,你需要):

if(facebookAccessToken != null){ 
     sessionExpired = facebookAccessToken.isExpired(); 
    }else{ 
     sessionExpired = true; 
    } 

更多信息在https://developers.facebook.com/docs/facebook-login/android

相關問題