Android 專用 Facebook 登入 - 快速入門

Facebook Android SDK 可讓用戶使用「Facebook 登入」來登入您的應用程式。當用戶使用 Facebook 帳號登入您的應用程式時,用戶可以將權限授予您的應用程式,讓您擷取資訊或代表用戶在 Facebook 上執行動作。

如需專案範例,以瞭解如何將「Facebook 登入」整合至 Android 應用程式,請參閱 GitHub 上的 FBLoginSample

按照下列步驟將「Facebook 登入」新增到您的應用程式。

1. 登入

若要建立應用程式或註冊成為開發人員,請登入 Facebook。

2. 下載 Facebook 應用程式

點擊下方按鈕來下載 Facebook 應用程式。

3. 整合 Facebook SDK

Android 專用 Facebook 登入 SDK 是 Facebook Android SDK 的元件。若要在專案中使用 Facebook 登入 SDK,請以 Maven 相依性的方式加入,或下載該 SDK。若要支援 Android 11 中的變更,請使用 SDK 8.1 以上版本。

使用 Maven

  1. 在專案中開啟 your_app > Gradle Scripts > build.gradle(專案),確認 buildscript { repositories {}} 中列出了以下存放庫:
    mavenCentral() 
    
  2. 在專案中開啟 your_app > Gradle Scripts > build.gradle(模組:應用程式),然後將下列實作陳述式新增至 dependencies{} 區塊以使用最新版的 Facebook 登入 SDK:
     implementation 'com.facebook.android:facebook-login:latest.release'
    
  3. 建置您的專案。

4. 編輯資源和 Manifest

如果您使用 Facebook Android SDK 5.15 版或較新版本,則無需加入 Chrome 自訂頁籤的活動或意願篩選器。SDK 已包含此功能。

整合 Facebook 登入後,除非停用自動應用程式事件記錄功能,否則系統會自動記錄並蒐集某些應用程式事件,以供事件管理工具使用。如需深入瞭解系統會蒐集哪些資訊,以及如何停用自動應用程式事件記錄功能,請參閱自動應用程式事件記錄功能

為您的 Facebook 應用程式編號及其他有需要的項目建立字串,以啟用 Chrome 自訂頁籤,同時將 FacebookActivity 新增至您的 Android 資訊清單。
  1. 開啟您的 /app/res/values/strings.xml 檔。
  2. 新增名稱為 facebook_app_idfb_login_protocol_schemefacebook_client_tokenstring 元素,並將值設定為您的應用程式編號用戶端權杖。例如,如果您的應用程式編號為 1234,用戶端權杖為 56789,則程式碼如下所示:
    <string name="facebook_app_id">1234</string>
    <string name="fb_login_protocol_scheme">fb1234</string>
    <string name="facebook_client_token">56789</string>
    
    
  3. 開啟 /app/manifest/AndroidManifest.xml 檔。
  4. meta-data 元素新增至應用程式編號和用戶端權杖的 application 元素:
    <application android:label="@string/app_name" ...>
        ...
       	<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
       	<meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>
        ...
    </application>
    
  5. application 元素內,新增 Facebook 的動態,以及 Chrome 自訂頁籤的動態及用途篩選條件:
        <activity android:name="com.facebook.FacebookActivity"
            android:configChanges=
                    "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name" />
        <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>
    
  6. uses-permission 元素新增至 application 元素之後的資訊清單:
    <uses-permission android:name="android.permission.INTERNET"/>
    
    
  7. (選用步驟)若要選擇退出廣告編號權限,請將 uses-permission 元素新增至 application 元素之後的資訊清單:
    <uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
            
  8. 您可以在 AndroidManifest.xml 檔案中設定 AutoLogAppEventsEnabled 標記,直接將應用程式事件的自動登入功能設為「true」或「false」。

  9. 建置您的專案。

5. 將應用程式與您的套件名稱和預設類別建立連結

你必須登入才能完成此步驟。

6. 提供您應用程式的「開發金鑰雜湊」和「發行金鑰雜湊」

你必須登入才能完成此步驟。

7. 啟用應用程式的單一登入

你必須登入才能完成此步驟。

8. 新增「Facebook 登入」按鈕

若要將「Facebook 登入」新增到應用程式,最簡單的方法就是從 SDK 新增 LoginButton 。此 LoginButton 是一個用戶介面元素,其包裝 LoginManager 中可用的功能。當有人點擊該按鈕時,系統將使用 LoginManager 中設定的權限啟動登入。「Facebook 登入」需要進階 public_profile 權限,才能由外部用戶使用。該按鈕會追蹤登入狀態,並根據某人的驗證狀態顯示正確的文字。
若要新增「Facebook 登入」按鈕,請先將其新增到版面 XML 檔中:
<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" /> 

9. 註冊回呼

現在呼叫 CallbackManager.Factory.create,建立 callbackManager 來處理登入回應。
callbackManager = CallbackManager.Factory.create();
若要將按鈕新增至片段,必須同時更新動態來使用片段。您可以自訂 Login button 的屬性,並在 onCreate()onCreateView() 方法中註冊回呼。可自訂的屬性包括 LoginBehaviorDefaultAudienceToolTipPopup.StyleLoginButton 的權限。例如:
      
    private static final String EMAIL = "email";
      
    loginButton = (LoginButton) findViewById(R.id.login_button);
    loginButton.setReadPermissions(Arrays.asList(EMAIL));
    // If you are using in a fragment, call loginButton.setFragment(this);    

    // 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
        }
    });
若要回應登入結果,需要使用 LoginManagerLoginButton 註冊回呼。若使用 LoginButton 註冊回呼,則不需在登入管理員註冊回呼。
將 LoginManager 回呼新增至動態或片段的 onCreate() 方法:
    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 方法中呼叫 callbackManager.onActivityResult,透過 callbackManager 將登入結果傳遞至 LoginManager

如果您使用 AndroidX 動態或片段,則不需覆寫 onActivityResult。

      @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }
您與 FacebookSDK 登入或分享所整合的每個動態和片段都應將 onActivityResult 轉傳至 callbackManager

10. 檢查登入狀態

您的應用程式一次只允許一位用戶登入,而且 LoginManager 會針對該用戶設定目前的 AccessTokenProfile。Facebook SDK 會將此資料儲存在共享偏好設定中,並在工作階段的一開始對其進行設定。您可以透過檢查 AccessToken.getCurrentAccessToken()Profile.getCurrentProfile() 來得知用戶是否已登入。
您的應用程式冷啟動後,您可以使用 SDK 從快取或應用程式書籤載入 AccessToken.getCurrentAccessToken。您可以在 ActivityonCreate 方法中檢查其有效性:
AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
  
您之後便可以執行實際登入,例如在自訂按鈕的 OnClickListener 中:
      
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));

11. 啟用「快速登入」

「快速登入」可讓用戶在不同的裝置和平台使用 Facebook 帳號登入。如果用戶在 Android 上登入您的應用程式,然後變更了裝置,「快速登入」將使用用戶的 Facebook 帳號將其登入,無須再要求用戶選擇登入方式。如此可避免建立重複的帳號,或完全無法登入。若要支援 Android 11 中的變更,請新增下列程式碼至 /app/manifest/AndroidManifest.xml 檔案的 queries 元素。
  
<queries> <package android:name="com.facebook.katana" /> </queries>   
以下程式碼顯示如何啟用「快速登入」。
LoginManager.getInstance().retrieveLoginStatus(this, new LoginStatusCallback() { @Override public void onCompleted(AccessToken accessToken) { // User was previously logged in, can log them in directly here. // If this callback is called, a popup notification appears that says // "Logged in as <User Name>" } @Override public void onFailure() { // No access token could be retrieved for the user } @Override public void onError(Exception exception) { // An error occurred } });   

後續步驟

恭喜,您已經將「Facebook 登入」新增至 Android 應用程式!請務必查看其他說明文件頁面,以取得更多進階指南。
實作資料刪除回呼,以回應用戶從 Facebook 刪除其資料的要求。
追蹤用戶的存取權杖和個人檔案。
管理您的應用程式可透過「Facebook 登入」存取的資料。
發生整合「Facebook 登入」方面的問題?查看常見問題清單和解決方法。
視您要求使用「Facebook 登入」的用戶所提供的 Facebook 資料而定,您可能需要在應用程式上線前,將應用程式提交審查。
若要建置您專屬的登入流程,請參閱手動建置登入流程