在 2021 年 10 月 5 日,Facebook 登入將不再支援 Android 內嵌瀏覽器(網頁檢視)用作身分驗證。

如需了解本次停用項目的背景資訊,請參閱網誌文章停用 Android 內嵌瀏覽器的 Facebook 登入身分驗證支援

如需有關停用網頁檢視和改用自訂分頁的資訊,請參閱停用 Android 網頁檢視

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 設為相依項目,或下載 SDK。若要支援 Android 11 的變更,請使用 SDK 8.1 版或更高版本。

使用 Maven

  1. 在您的專案中,開啟 your_app > Gradle Scripts > build.gradle (Project),並確保下列儲存庫已列於 buildscript { repositories {}} 中:
    mavenCentral() 
    
  2. 在您的專案中,開啟 your_app > Gradle Scripts > build.gradle (Module: app),並將下列編譯陳述式加入 dependencies{} 部分,以便使用最新版本的 Facebook 登入 SDK:
     implementation 'com.facebook.android:facebook-login:latest.release'
    
  3. 建立您的專案。

4.編輯您的資源和 Manifest

如果您使用 v5.15 或以上版本的 Android 專用 Facebook SDK,則不需要為 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 註冊回呼。
將 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。FacebookSDK 會將此資料儲存在共享偏好設定中,並於連線階段的一開始就進行設定。您可以透過檢查 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 } });   

後續步驟

恭喜!您已成功在 Android 應用程式中新增 Facebook 登入功能!請記得查閱我們其他的文件頁面,取得更多進階指南。
執行資料刪除回呼,以回應用戶從 Facebook 刪除資料的要求。
追蹤用戶的存取憑證及個人檔案。
透過 Facebook 登入功能管理應用程式能存取的資料。
無法順利整合 Facebook 登入功能?查看常見問題及相關的解決辦法。
視乎您想透過 Facebook 登入功能向用戶索取哪些 Facebook 資料,您可能需要先提交應用程式以供審查,才可正式發佈該應用程式。
如要了解如何建立自有登入流程,請參閱手動建立登入流程