Android 版 Facebook 登录 — 快速入门

Android 版 Facebook 登录 — 快速入门

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

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

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

1. 选择应用或新建应用

选择应用或新建应用,将应用相关信息输入以下代码片段。

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. 构建项目。

使用 Facebook 登录 SDK 时,如果未禁用事件自动记录功能,那么系统将自动记录和收集应用事件,以用于 Facebook 分析。关于哪些信息会被收集以及如何禁用事件自动记录的详细信息,请参阅应用事件自动记录

4.编辑您的资源和清单

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

为您的 Facebook 应用编号以及启用 Chrome 自定义选项卡所需的 Facebook 应用编号创建字符串。同时,将 FacebookActivity 添加到您的 Android 清单中。

  1. 打开您的 /app/res/values/strings.xml 文件。
  2. 添加名称为 facebook_app_idfb_login_protocol_scheme 以及 facebook_client_token 的 string 元素,并设置应用编号客户端口令的值。例如,如果您的应用编号为 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. 在 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. 构建项目。

5.将软件包名称和默认类与应用进行关联

软件包名称

软件包名称是 Android 应用的唯一标识。如果用户未下载您的应用,我们就会使用此名称让他们能在 Google Play 找到应用并下载。您可以在 Android Manifest 文件或应用的 build.gradle 文件中找到此信息。

默认活动类名称

这是处理深度链接的 activity(如 com.example.app.DeepLinkingActivity)的完整且合格的类名称。从 Facebook 应用深度链接至您的应用时,我们就会使用此名称。您也可以在 Android 清单文件中找到该名称。

6.为应用提供开发和发布密钥散列

为确保您的应用和 Facebook 之间互动的真实性,您需要向我们提供适用于您开发环境的 Android 密钥散列。如果您的应用已经发布,则还应该添加发布密钥散列。
生成开发密钥散列

每个 Android 开发环境都将会有一个唯一的开发密钥散列。

Mac OS
您将需要 Java 开发包中的密钥和证书管理工具 (keytool)。
如要生成开发密钥散列,请打开终端窗口,运行以下命令:

      
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
复制代码

Windows
您需要以下各项:

如要生成开发密钥散列,请在 Java SDK 文件夹的命令提示符中运行以下命令:

      
keytool -exportcert -alias androiddebugkey -keystore "C:\Users\USERNAME\.android\debug.keystore" | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" sha1 -binary | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" base64
      
复制代码

此命令将针对您的开发环境生成一个包含 28 个字符的唯一密钥散列。将其复制粘贴到下方字段中。您需要向每位应用开发人员的开发环境分别提供开发密钥散列。

生成发布密钥散列

Android 应用必须先使用发布密钥进行电子签名,然后才能上传到商店中。如要生成发布密钥散列,请在 Mac 或 Windows 内运行以下命令,并替换您的发布密钥别名和密钥库路径:

      
keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64
复制代码

这会生成一个包含 28 个字符的字符串,您应将其复制粘贴到下方字段中。另外,请参阅 Android 文档,了解有关应用签名的信息。

密钥散列
N5nQedmSE4O2KKz+ueEDQaO+4RQ=

7.为应用启用单点登录

启用单点登录

如果您想为 Android 通知添加启动应用的功能,请启用单点登录。

单点登录将从 Android 通知中启动

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
        }
    });
复制代码
要响应登录结果,需要使用 LoginManager 或 LoginButton 注册回调。如果使用 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 会为该用户设置当前的 AccessToken 和 Profile。FacebookSDK 会将该数据保存在共享首选项中,并在会话开始时设置此数据。您可以通过检查 AccessToken.getCurrentAccessToken() 和 Profile.getCurrentProfile() 来查看用户是否已登录。
您可以通过 SDK 从缓存或应用书签中(如果应用冷启动)加载 AccessToken.getCurrentAccessToken。您应在 Activity 的 onCreate 方法中检查它的有效性:

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 数据而定,在发布应用前,您可能需要先提交审核。

如要构建您自己的登录流程,请参阅手动构建登录流程