Android 版 Facebook 登录 — 快速入门
Android 版 Facebook SDK 让用户能够使用 Facebook 登录登录到您的应用。当用户通过 Facebook 登录应用时,可以向应用授予权限,以便您可以代表他们在 Facebook 上检索信息或执行操作。
如需通过项目示例了解如何在 Android 应用中集成 Facebook 登录,请前往 GitHub,参阅其中的 FBLoginSample。
按照以下步骤,将 Facebook 登录添加到您的应用。
2.下载 Facebook 应用
3.集成 Facebook SDK
使用 Maven
- 在项目中,打开 your_app > Gradle Scripts > build.gradle (Project),确保已将下列存储库添加到
buildscript { repositories {}}
中:mavenCentral()
复制代码 - 在项目中,打开 your_app > Gradle Scripts > build.gradle (Module: app) 并将下列执行语句添加到
dependencies{}
部分,以便依赖于最新版的 Facebook 登录 SDK:implementation 'com.facebook.android:facebook-login:latest.release'
复制代码 - 构建项目。
使用 Facebook 登录 SDK 时,如果未禁用事件自动记录功能,那么系统将自动记录和收集应用事件,以用于 Facebook 分析。关于哪些信息会被收集以及如何禁用事件自动记录的详细信息,请参阅应用事件自动记录。
4.编辑您的资源和清单
如果您使用 5.15 或更高版本的 Android 版 Facebook SDK,则不需要为 Chrome 自定义选项卡添加活动或意图筛选条件。此功能包含在 SDK 中。
为您的 Facebook 应用编号以及启用 Chrome 自定义选项卡所需的 Facebook 应用编号创建字符串。同时,将 FacebookActivity
添加到您的 Android 清单中。
- 打开您的
/app/res/values/strings.xml
文件。 - 添加名称为
facebook_app_id
、fb_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>
复制代码 - 打开
/app/manifest/AndroidManifest.xml
文件。 - 将
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>
复制代码 - 在
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>
复制代码 - 在
application
元素后的清单中添加uses-permission
元素:<uses-permission android:name="android.permission.INTERNET"/>
复制代码 - (可选)要禁用广告编号权限,请在
application
元素后的清单中添加uses-permission
元素:<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
复制代码 - 构建项目。
5.将软件包名称和默认类与应用进行关联
6.为应用提供开发和发布密钥散列
每个 Android 开发环境都将会有一个唯一的开发密钥散列。
Mac OS
您将需要 Java 开发包中的密钥和证书管理工具 (keytool
)。
如要生成开发密钥散列,请打开终端窗口,运行以下命令:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Windows
您需要以下各项:
-
Java 开发包中的密钥和证书管理工具 (
keytool
) -
Google Code Archive 的 Windows 版
openssl-for-windows
OpenSSL 库
如要生成开发密钥散列,请在 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 文档,了解有关应用签名的信息。
7.为应用启用单点登录
8.添加 Facebook“登录”按钮
LoginButton
。LoginButton 是
一个用户界面元素,其中包含 LoginManager 中的可用功能
。用户点击该按钮时,系统就会使用 LoginManager 中设置的权限发起登录流程
。Facebook 登录需要取得高级 public_profile 权限,才能供外部用户使用。此按钮随登录状态变化,并根据用户的身份验证状态显示正确文本。<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.Factory.create();
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”。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { callbackManager.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); }
onActivityResult
转发至 callbackManager
。10.检查登录状态
LoginManager
会为该用户设置当前的 AccessToken
和 Profile
。FacebookSDK 会将该数据保存在共享首选项中,并在会话开始时设置此数据。您可以通过检查 AccessToken.getCurrentAccessToken()
和 Profile.getCurrentProfile()
来查看用户是否已登录。AccessToken.getCurrentAccessToken
。您应在 Activity
的 onCreate
方法中检查它的有效性:
AccessToken accessToken = AccessToken.getCurrentAccessToken(); boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
OnClickListener
中:
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));
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 } });
后续步骤
执行数据删除回调,以响应用户删除从 Facebook 所获取数据的请求。
追踪用户的访问口令和个人主页。
控制您的应用有权通过 Facebook 登录功能访问哪些数据。
集成 Facebook 登录功能时遇到问题?请参阅常见问题清单及问题解决方法。
根据您向使用 Facebook 登录的用户请求的 Facebook 数据而定,在发布应用前,您可能需要先提交审核。
如要构建您自己的登录流程,请参阅手动构建登录流程。