在 2021 年 10 月 5 日,Facebook 登入將不再支援 Android 內嵌瀏覽器(網頁檢視)用作身分驗證。
如需了解本次停用項目的背景資訊,請參閱網誌文章停用 Android 內嵌瀏覽器的 Facebook 登入身分驗證支援。
如需有關停用網頁檢視和改用自訂分頁的資訊,請參閱停用 Android 網頁檢視。
Facebook Android SDK 讓用戶可使用 Facebook 登入來登入您的應用程式。當用戶使用 Facebook 帳戶登入您的應用程式時,用戶可向您的應用程式授予權限,以便您代表用戶在 Facebook 上檢索資訊或執行動作。
如需透過專案範例了解如何將 Facebook 登入整合至 Android 應用程式,請前往 GitHub 參閱 FBLoginSample。
按照下方步驟在應用程式中加入 Facebook 登入。
buildscript { repositories {}}
中: dependencies{}
部分,以便使用最新版本的 Facebook 登入 SDK: 如果您使用 v5.15 或以上版本的 Android 專用 Facebook SDK,則不需要為 Chrome 自訂分頁新增動態或意圖篩選條件。此功能包含在 SDK 中。
在您整合 Facebook 登入後,除非您停用事件自動記錄功能,否則系統會為事件管理工具自動記錄並蒐集特定應用程式事件。若要進一步了解系統會蒐集哪些資料,以及如何停用事件自動記錄功能,請參閱應用程式事件自動記錄一文。
FacebookActivity
加入您的 Android 資訊清單。 /app/res/values/strings.xml
檔案。facebook_app_id
、fb_login_protocol_scheme
和 facebook_client_token
的 string
素材,並將值設定為您的應用程式編號和用戶端憑證。例如,如果您的應用程式編號為 1234
,而用戶端憑證為 56789
,則程式碼如下所示: /app/manifest/AndroidManifest.xml
檔案。 meta-data
素材加入您應用程式編號和用戶端憑證的 application
素材: 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>
uses-permission
素材加入 application
素材之後的資訊清單: uses-permission
素材加入 application
素材之後的資訊清單: 您可以在 AndroidManifest.xml
檔案設定 AutoLogAppEventsEnabled
標示,以直接將自動記錄應用程式事件的功能設為「true」或「false」。
LoginButton
。這個 LoginButton
是一個用戶介面元素,當中包含 LoginManager
中的可用功能。用戶點擊此按鈕時,系統就會以 LoginManager
中所設的權限啟動登入程序。「Facebook 登入」需要進階 public_profile 權限,以供外部用戶使用。此按鈕會隨登入狀態變化,並會根據用戶的身分驗證狀態來顯示正確文字。 CallbackManager.Factory.create
建立 callbackManager 來處理登入回應。 Login button
的屬性並在 onCreate()
或 onCreateView()
方法中註冊回呼。可自訂的屬性包括 LoginBehavior
、DefaultAudience
、ToolTipPopup.Style
和 LoginButton
的權限,例如: 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 } });
LoginManager
或 LoginButton
註冊回呼。如果使用 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」。
onActivityResult
輸送至 callbackManager
。 LoginManager
會針對該用戶設定目前的 AccessToken
和 Profile
。FacebookSDK 會將此資料儲存在共享偏好設定中,並於連線階段的一開始就進行設定。您可以透過檢查 AccessToken.getCurrentAccessToken()
和 Profile.getCurrentProfile()
來得知是否已有用戶登入。 AccessToken.getCurrentAccessToken
。您應該在 Activity
的 onCreate
方法中檢查其有效性:/app/manifest/AndroidManifest.xml
檔案中的 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 } });