Android 版 Facebook SDK 讓用戶可以通過 Facebook 登錄注冊您的應用。通過 Facebook 登錄您的應用時,用戶可以向應用授予權限,以便您可以檢索信息或以用戶的身份在 Facebook 執行操作。
如 果使用 Android 版 Facebook SDK 4.14.0 開發應用,Facebook 登錄功能就會自動與 Facebook Lite 集成。如果用戶未安裝 Android 版 Facebook 應用,Facebook 登錄就會使用 Facebook Lite,展示登錄界面並獲得登錄憑證。舊版 SDK 要求用戶必須安裝 Facebook 應用。
要詳細了解 Facebook 登錄,請參閱登錄門戶。要詳細了解使用案例和功能,請參閱概覽。如需獲取關於權限的信息,請參閱 Android 權限管理和 Facebook 登錄相關的權限。
按照以下步驟部署 Facebook 登錄:
1.前提條件
2.添加 Facebook“登錄”按鈕
3.注冊回調,處理登錄結果
4.啟用 Chrome 自定義選項卡
5.檢查登錄狀態
另請參閱后續步驟了解進階主題。
1.前提條件
開始實施 Facebook 登錄之前,請確保已完成下列設置。
A. 下載 Facebook 應用
點擊下方的按鈕,下載 Facebook 應用。
下載 Android 版 FacebookB. 創建開發者帳戶
如果沒有 Facebook 開發者帳戶,請點擊下面的按鈕創建。您可以通過 Facebook 開發者帳戶使用開發者工具和創建 Facebook 應用。
創建開發者帳戶C. 下載 Android SDK
下載最新的 Android 版 Facebook SDK。
下載 Android SDKD. 獲得 Facebook 應用編號、添加 SDK、以及向資料頁添加密鑰散列
點擊下方的按鈕,按照快速入門操作,也可以按照新手入門中的步驟操作。
Android 快速入門E. 為應用啟用單點登錄
為應用啟用單點登錄的方法是:在 Facebook 開發者網站的我的應用中選擇您的應用,然后選擇應用的設置,並將單點登錄設置為是。
F. 將 FacebookActivity
添加到 AndroidManifest.xml
中。
<activity android:name="com.facebook.FacebookActivity" android:configChanges= "keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:label="@string/app_name" />
2.添加 Facebook“登錄”按鈕
將 Facebook 登錄添加到應用的最簡單方法是從 SDK 添加 LoginButton
。這是 Button
的自定義視圖實施。您可以在應用中使用該按鈕實施 Facebook 登錄。

您可以結合 LoginButton
使用 SDK 提供的以下類:
-
LoginManager — 使用請求的讀取或發布權限開始登錄流程。
-
CallbackManager — 用於將調用按指定路徑發送回 Facebook SDK 及您注冊的回調。您應從開始活動或
onActivityResult
片段調用它。 -
AccessToken:— 使用該類圖譜 API 請求。它會顯示用戶編號以及用戶接受和拒絕的權限。
-
Profile — 該類包含關於已登錄用戶的基本信息。
LoginButton
是一個界面元素,其中包含 LoginManager
具備的功能。因此,當用戶點擊此按鈕時,就會以 LoginManager
中設置的權限開始登錄。按鈕隨登錄狀態變化,並根據用戶的身份驗證狀態顯示正確文本。
要添加 Facebook 登錄按鈕,請先將其添加到布局 XML 文件中,並使用完整的類名稱 com.facebook.widget.LoginButton
:
<com.facebook.login.widget.LoginButton android:id="@+id/login_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="30dp" android:layout_marginBottom="30dp" />
然后在界面中設置按鈕:將按鈕添加到片段中,並更新活動以使用片段。
您可以自定義 Login button
的屬性,並在 onCreateView()
方法中注冊一個回調。
您可以自定義的屬性包括 LoginBehavior
、DefaultAudience
、ToolTipPopup.Style
以及 LoginButton
的相關權限。例如:
@Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.splash, container, false); loginButton = (LoginButton) view.findViewById(R.id.login_button); loginButton.setReadPermissions("email"); // If using in a fragment loginButton.setFragment(this); // Other app specific specialization // Callback registration loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { // App code } @Override public void onCancel() { // App code } @Override public void onError(FacebookException exception) { // App code } }); }
如果您在片段中使用 LoginButton
,需要通過調用 setFragment
來設置按鈕上的片段,如圖所示。
之后您需要調用 FacebookSdk.sdkInitialize
來初始化 SDK,然后調用 CallbackManager.Factory.create
來創建回調管理器,以便處理登錄響應。以下是在片段中添加回調的示例:
public class MainActivity extends FragmentActivity { CallbackManager callbackManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FacebookSdk.sdkInitialize(getApplicationContext()); callbackManager = CallbackManager.Factory.create(); LoginButton loginButton = (LoginButton) view.findViewById(R.id.usersettings_fragment_login_button); loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { ... }); }
最后您應調用 callbackManager.onActivityResult
,以便通過 callbackManager
將登錄結果傳遞至 LoginManager
。
3.注冊回調
為了響應登錄結果,您需要使用 LoginManager
或 LoginButton
注冊回調。如果您使用 LoginButton
注冊回調,就不需要在登錄管理器中注冊回調。
將回調添加到活動或片段的 onCreate()
方法:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FacebookSdk.sdkInitialize(this.getApplicationContext()); callbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { // App code } @Override public void onCancel() { // App code } @Override public void onError(FacebookException exception) { // App code } }); }
如果登錄成功,LoginResult
參數將擁有新的 AccessToken
及最新授予或拒絕的權限。
您不需要 registerCallback
來保證登錄成功,可以選擇使用下述 AccessTokenTracker
類跟蹤當前訪問口令的更改。
之后在 onActivityResult()
中,將登錄結果轉發到在 onCreate()
中創建的 callbackManager
:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); }
您集成到 FacebookSDK 登錄或分享的所有活動和片段都應將 onActivityResult
轉發給 callbackManager
4.啟用 Chrome 自定義選項卡
將意圖篩選條件添加到 manifest 文件,將 fb_login_protocol_scheme
添加到 strings.xml
文件,啟用 Chrome 自定義選項卡。啟用 Chrome 自定義選項卡時,如果未安裝 Facebook 應用,SDK 會在 Chrome 自定義選項卡中展示“登錄”對話框,而不是網頁視圖中。因此,如果用戶已在 Chrome 瀏覽器中登錄 Facebook,則無需再次輸入憑證。
向 AndroidManifest.xml
文件添加以下意圖篩選條件:
<activity android:name="com.facebook.CustomTabActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="@string/fb_login_protocol_scheme" /> </intent-filter> </activity>
在 strings.xml
文件中添加以下代碼:
// if your App ID is 1234567, you should use fb1234567 <string name="fb_login_protocol_scheme">fbAPP_ID</string>
5.檢查登錄狀態
您的應用一次只能登錄一個用戶,LoginManager
會為該用戶設置當前的 AccessToken
和 Profile
。FacebookSDK 會將該數據保存在共享首選項中,並在 SDK 初始化過程中進行設置。您可以通過檢查 AccessToken.getCurrentAccessToken()
和 Profile.getCurrentProfile() 來查看用戶是否已登錄。
獲取當前口令
您可以通過 SDK 從緩存或應用書簽中(如果應用冷啟動)加載 AccessToken.getCurrentAccessToken
。您應在 Activity
的 onCreate
方法中檢查它的有效性:
public class MainActivity extends FragmentActivity { CallbackManager callbackManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FacebookSdk.sdkInitialize(getApplicationContext()); callbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {...}); }
稍后您可以執行實際登錄,例如在自定義按鈕的 OnClickListener
中:
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));
最后,在 Activity
的 onActivityResult
中,將結果傳遞到 CallbackManager
:
@Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); }