自 2021 年 10 月 5 日起,Facebook 登录将不再支持使用 Android 嵌入式浏览器 (WebView) 来验证用户身份。

有关此停用的背景信息,请参阅博文停止在 Android 嵌入式浏览器上对 FB 登录身份验证的支持

有关停用 WebView 和改用自定义选项卡的信息,请参阅停用 Android WebView

Android 版 Facebook 登录 — 快速入门

Android 版 Facebook SDK 让用户能够使用 Facebook 登录登录到您的应用。当用户通过 Facebook 登录应用时,可以向应用授予权限,以便您可以代表他们在 Facebook 上检索信息或执行操作。

如需通过项目示例了解如何在 Android 应用中集成 Facebook 登录,请前往 GitHub,参阅其中的 FBLoginSample

按照以下步骤,将 Facebook 登录添加到您的应用。

1. 登录

请登录 Facebook 来创建应用或注册为开发者。

2. 下载 Facebook 应用

点击下方的按钮,下载 Facebook 应用。

3. 集成 Facebook SDK

Android 版 Facebook 登录 SDK 是 Android 版 Facebook SDK 的一个组件。如要在您的项目中使用 Facebook 登录 SDK,请使其成为 Maven 中的一个依赖项,或者将其下载下来。如需在 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. 编辑您的资源和清单

如果您使用 Android 版 Facebook SDK 版本 5.15 或更高版本,则不需要为 Chrome 自定义选项卡添加活动或意图筛选条件。此功能包含在 SDK 中。

在您集成 Facebook 登录之后,如果未禁用自动应用事件记录功能,系统将为事件管理工具自动记录和收集特定的应用事件。如要详细了解系统会收集哪些信息以及如何禁用自动应用事件记录功能,请参阅自动应用事件记录

为您的 Facebook 应用编号以及启用 Chrome 自定义选项卡所需的项目创建字符串。同时,将 FacebookActivity 添加到您的 Android 清单中。
  1. 打开您的 /app/res/values/strings.xml 文件。
  2. 添加名称为 facebook_app_idfb_login_protocol_scheme 以及 facebook_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. application 元素中,针对应用编号和客户端口令添加 meta-data 元素:
    <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. 在清单中 application 元素的后面添加 uses-permission 元素:
    <uses-permission android:name="android.permission.INTERNET"/>
    
    
  7. (可选)要停止使用广告编号权限,请在清单中 application 元素的后面添加 uses-permission 元素:
    <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,从而通过调用 CallbackManager.Factory.create 处理登录响应。
callbackManager = CallbackManager.Factory.create();
如要为片段添加按钮,则必须同时更新活动,才能使用片段。可以自定义 Login button 的属性,并且使用 onCreate()onCreateView() 方法注册回调。支持自定义的属性包括 LoginBehaviorDefaultAudienceToolTipPopup.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
        }
    });
要响应登录结果,需要使用 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 数据而定,在发布应用前,您可能需要先提交审核。
如要构建您自己的登录流程,请参阅手动构建登录流程