從 2021 年 10 月 5 日起,「Facebook 登入」將不再為驗證用戶支援 Android 內嵌瀏覽器(WebView)。
如需有關此停用的背景資訊,請參閱部落格文章在 Android 內嵌瀏覽器停用「Facebook 登入」驗證的支援。
如需有關停用 Webview 並改用「自訂頁籤」的資訊,請參閱停用 Android WebView。
Facebook Android SDK 可讓用戶使用「Facebook 登入」來登入您的應用程式。當用戶使用 Facebook 帳號登入您的應用程式時,用戶可以將權限授予您的應用程式,讓您擷取資訊或代表用戶在 Facebook 上執行動作。
如需專案範例,以瞭解如何將「Facebook 登入」整合至 Android 應用程式,請參閱 GitHub 上的 FBLoginSample。
按照下列步驟將「Facebook 登入」新增到您的應用程式。
buildscript { repositories {}}
中列出了以下存放庫: dependencies{}
區塊以使用最新版的 Facebook 登入 SDK: 如果您使用 Facebook Android SDK 5.15 版或較新版本,則無需加入 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
註冊回呼,則不需在登入管理員註冊回呼。 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
。Facebook SDK 會將此資料儲存在共享偏好設定中,並在工作階段的一開始對其進行設定。您可以透過檢查 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 } });