由于項目中需要使用Facebook進行一鍵登錄,所以記錄下步驟,其實小伙伴直接看官網也可以,介紹的蠻詳細的,先看下效果圖吧。

遵循以下步驟將Facebook登錄添加到您的應用。
Facebook開發(fā)者網站:https://developers.facebook.com/apps/
1.選擇應用或新建應用
選擇應用或新建應用,將應用相關信息輸入以下代碼片段。
2.下載Facebook應用
點擊下方的按鈕,下載Facebook應用。
下載Android版Facebook
3.集成的Facebook SDK
Android版Facebook登錄SDK是Android版Facebook SDK的一個組件。如要在您的項目中使用Facebook登錄SDK,請轉變?yōu)镸aven中的一個依賴項,或者將其下載下來。如需在Android 11中支持這些更改,請使用SDK版本8.1或更高版本。
使用Maven
- 在您的項目中,打開your_app > Gradle腳本> build.gradle(Project),確保以下存儲庫都添加到
buildscript { repositories {}}中:
jcenter ()
- 在您的項目中,打開your_app > Gradle腳本> build.gradle(模塊:app)依次執(zhí)行語句添加到
dependencies{}部分,踩依賴于最新版的Facebook登錄SDK:
implementation 'com.facebook.android:facebook-login:[8.1)'
- 構建項目。
使用 Facebook 登錄 SDK 時,如果未禁用事件自動記錄功能,那么系統(tǒng)將自動記錄和收集應用事件,以用于 Facebook 分析。關于哪些信息會被收集以及如何禁用事件自動記錄的詳細信息,請參閱應用事件自動記錄。
4.編輯您的資源和清單
如果您使用 Android 版 Facebook SDK 版本 5.15 或更高版本,則不需要為 Chrome 自定義選項卡添加活動或意圖篩選條件。此功能包含在 SDK 中。
為您的 Facebook 應用編號以及啟用 Chrome 自定義選項卡所需的 Facebook 應用編號創(chuàng)建字符串。另外,請將 FacebookActivity 添加到您的 Android 清單文件中。
1.打開您的 /app/res/values/strings.xml 文件。
2.添加如下所示的代碼:
<string name="facebook_app_id">你的項目生成的ID</string>
<string name="fb_login_protocol_scheme">fb你的項目生成的ID</string>
3.打開 /app/manifest/AndroidManifest.xml 文件。
4.在 application 元素后添加以下 uses-permission 元素:
<uses-permission android:name="android.permission.INTERNET"/>
5.在 application 元素中添加以下 meta-data 元素、一個針對 Facebook 的 activity 元素以及一個針對 Chrome 自定義選項卡的 activity 元素和意向篩選條件:
<meta-data android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
<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>
5.將軟件包名稱和默認類與應用進行關聯(lián)
軟件包名稱
軟件包名稱是 Android 應用的唯一標識。如果用戶未下載您的應用,我們就會使用此名稱讓他們能在 Google Play 找到應用并下載。您可以在 Android Manifest 文件或應用的 build.gradle 文件中找到此信息。
你項目的包名
默認活動類名稱
這是處理深度鏈接的 activity(如 com.example.app.DeepLinkingActivity)的完整且合格的類名稱。從 Facebook 應用深度鏈接至您的應用時,我們就會使用此名稱。您也可以在 Android 清單文件中找到該名稱。
activity的路徑信息
6.為應用提供開發(fā)和發(fā)布密鑰散列
為確保您的應用和 Facebook 之間互動的真實性,您需要向我們提供適用于您開發(fā)環(huán)境的 Android 密鑰散列。如果您的應用已經發(fā)布,則還應該添加發(fā)布密鑰散列。
生成開發(fā)密鑰散列
每個 Android 開發(fā)環(huán)境都將會有一個唯一的開發(fā)密鑰散列。
Mac OS
您將需要 Java 開發(fā)包中的密鑰和證書管理工具 (keytool)。
如要生成開發(fā)密鑰散列,請打開終端窗口,運行以下命令:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Windows
您需要以下各項:
- Java 開發(fā)包中的密鑰和證書管理工具 (
keytool) -
Google Code Archive 的 Windows 版
openssl-for-windowsOpenSSL 庫
如要生成開發(fā)密鑰散列,請在 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
此命令將針對您的開發(fā)環(huán)境生成一個包含 28 個字符的唯一密鑰散列。將其復制粘貼到下方字段中。您需要向每位應用開發(fā)人員的開發(fā)環(huán)境分別提供開發(fā)密鑰散列。
生成發(fā)布密鑰散列
Android 應用必須先使用發(fā)布密鑰進行電子簽名,然后才能上傳到商店中。如要生成發(fā)布密鑰散列,請在 Mac 或 Windows 內運行以下命令,并替換您的發(fā)布密鑰別名和密鑰庫路徑:
keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64
這會生成一個包含 28 個字符的字符串,您應將其復制粘貼到下方字段中。另外,請參閱 Android 文檔,了解有關應用簽名的信息,也可以代碼獲取,這樣更簡單。
try {
int i = 0;
PackageInfo info = getPackageManager().getPackageInfo( getPackageName(), PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
i++;
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String KeyHash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
//KeyHash 就是你要的,不用改任何代碼 復制粘貼 ;
Log.e("獲取應用KeyHash", "KeyHash: " + KeyHash);
}
}
catch (Exception e) {
}

7.為應用啟用單點登錄
啟用單點登錄
如果您想為 Android 通知添加啟動應用的功能,請啟用單點登錄。
8.添加 Facebook“登錄”按鈕
向應用添加“Facebook 登錄”按鈕的最簡單方法是從 SDK 添加 LoginButton。LoginButton 是一個界面元素,其中包含 LoginManager 具備的功能。用戶點擊按鈕后,就會以 LoginManager 中設置的權限開始登錄。按鈕隨登錄狀態(tài)變化,并根據(jù)用戶的身份驗證狀態(tài)顯示正確文本。
要添加 Facebook 登錄按鈕,請先將其添加到布局 XML 文件中:(官網中提供了Facebook SDK內置的登錄按鈕,但大部分開發(fā)中,我們都是有自己的一套UI,所以我就只介紹自定義登錄按鈕的流程了。)
<LinearLayout
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_margin="20dp"
android:background="@drawable/bg_button"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:text="Facebook登錄"
android:textColor="@color/white"
android:textSize="19sp"
tools:ignore="HardcodedText" />
</LinearLayout>
9.注冊回調
現(xiàn)在調用 CallbackManager.Factory.create,創(chuàng)建 callbackManager,以便處理登錄響應。
callbackManager = CallbackManager.Factory.create();
下面是完整代碼:
public class MainActivity extends AppCompatActivity {
private ImageView tx_PictureUrl;
private TextView tx_DisplayName;
private TextView tx_UserId;
private CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tx_PictureUrl = findViewById(R.id.tx_PictureUrl);
tx_DisplayName = findViewById(R.id.tx_DisplayName);
tx_UserId = findViewById(R.id.tx_UserId);
callbackManager = CallbackManager.Factory.create();
LinearLayout loginButton = findViewById(R.id.btn_login);
loginButton.setOnClickListener(v -> LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile", "user_friends")));
LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onCancel() {
CookieSyncManager.createInstance(MainActivity.this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
}
@Override
public void onError(FacebookException arg0) {
Log.d("onError", arg0.toString());
}
@Override
public void onSuccess(LoginResult arg0) {
Log.d("onSuccess", "登錄成功!");
updateUI();
}
});
}
@SuppressLint("SetTextI18n")
private void updateUI() {
boolean enableButtons = AccessToken.getCurrentAccessToken() != null;
Profile profile = Profile.getCurrentProfile();
if (enableButtons && profile != null) {
Glide.with(MainActivity.this).load(profile.getProfilePictureUri(150, 150).toString()).into(tx_PictureUrl);
tx_DisplayName.setText("昵稱:" + profile.getName());
tx_UserId.setText("UserId:" + AccessToken.getCurrentAccessToken().getUserId());
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode,
resultCode, data);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
}
注意:如果應用沒有發(fā)布的話,只有開發(fā)者和測試者可以訪問,因為是測試的賬號發(fā)布了幾次還是失敗,所以暫時還未發(fā)布。