由于項目中需要使用Facebook進(jìn)行一鍵登錄,所以記錄下步驟,其實小伙伴直接看官網(wǎng)也可以,介紹的蠻詳細(xì)的,先看下效果圖吧。
遵循以下步驟將Facebook登錄添加到您的應(yīng)用。
Facebook開發(fā)者網(wǎng)站:https://developers.facebook.com/apps/
1.選擇應(yīng)用或新建應(yīng)用
選擇應(yīng)用或新建應(yīng)用,將應(yīng)用相關(guān)信息輸入以下代碼片段。2.下載Facebook應(yīng)用
點擊下方的按鈕,下載Facebook應(yīng)用。
下載Android版Facebook
3.集成的Facebook SDK
Android版Facebook登錄SDK是Android版Facebook SDK的一個組件。如要在您的項目中使用Facebook登錄SDK,請轉(zhuǎn)變?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)'
- 構(gòu)建項目。
使用 Facebook 登錄 SDK 時,如果未禁用事件自動記錄功能,那么系統(tǒng)將自動記錄和收集應(yīng)用事件,以用于 Facebook 分析。關(guān)于哪些信息會被收集以及如何禁用事件自動記錄的詳細(xì)信息,請參閱應(yīng)用事件自動記錄。
4.編輯您的資源和清單
如果您使用 Android 版 Facebook SDK 版本 5.15 或更高版本,則不需要為 Chrome 自定義選項卡添加活動或意圖篩選條件。此功能包含在 SDK 中。
為您的 Facebook 應(yīng)用編號以及啟用 Chrome 自定義選項卡所需的 Facebook 應(yīng)用編號創(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.將軟件包名稱和默認(rèn)類與應(yīng)用進(jìn)行關(guān)聯(lián)
軟件包名稱
軟件包名稱是 Android 應(yīng)用的唯一標(biāo)識。如果用戶未下載您的應(yīng)用,我們就會使用此名稱讓他們能在 Google Play 找到應(yīng)用并下載。您可以在 Android Manifest 文件或應(yīng)用的 build.gradle 文件中找到此信息。
你項目的包名
默認(rèn)活動類名稱
這是處理深度鏈接的 activity(如 com.example.app.DeepLinkingActivity)的完整且合格的類名稱。從 Facebook 應(yīng)用深度鏈接至您的應(yīng)用時,我們就會使用此名稱。您也可以在 Android 清單文件中找到該名稱。
activity的路徑信息
6.為應(yīng)用提供開發(fā)和發(fā)布密鑰散列
為確保您的應(yīng)用和 Facebook 之間互動的真實性,您需要向我們提供適用于您開發(fā)環(huán)境的 Android 密鑰散列。如果您的應(yīng)用已經(jīng)發(fā)布,則還應(yīng)該添加發(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-windows
OpenSSL 庫
如要生成開發(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ù)制粘貼到下方字段中。您需要向每位應(yīng)用開發(fā)人員的開發(fā)環(huán)境分別提供開發(fā)密鑰散列。
生成發(fā)布密鑰散列
Android 應(yīng)用必須先使用發(fā)布密鑰進(jìn)行電子簽名,然后才能上傳到商店中。如要生成發(fā)布密鑰散列,請在 Mac 或 Windows 內(nèi)運行以下命令,并替換您的發(fā)布密鑰別名和密鑰庫路徑:
keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64
這會生成一個包含 28 個字符的字符串,您應(yīng)將其復(fù)制粘貼到下方字段中。另外,請參閱 Android 文檔,了解有關(guān)應(yīng)用簽名的信息,也可以代碼獲取,這樣更簡單。
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 就是你要的,不用改任何代碼 復(fù)制粘貼 ;
Log.e("獲取應(yīng)用KeyHash", "KeyHash: " + KeyHash);
}
}
catch (Exception e) {
}
7.為應(yīng)用啟用單點登錄
啟用單點登錄
如果您想為 Android 通知添加啟動應(yīng)用的功能,請啟用單點登錄。
8.添加 Facebook“登錄”按鈕
向應(yīng)用添加“Facebook 登錄”按鈕的最簡單方法是從 SDK 添加 LoginButton。LoginButton 是一個界面元素,其中包含 LoginManager 具備的功能。用戶點擊按鈕后,就會以 LoginManager 中設(shè)置的權(quán)限開始登錄。按鈕隨登錄狀態(tài)變化,并根據(jù)用戶的身份驗證狀態(tài)顯示正確文本。
要添加 Facebook 登錄按鈕,請先將其添加到布局 XML 文件中:(官網(wǎng)中提供了Facebook SDK內(nèi)置的登錄按鈕,但大部分開發(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.注冊回調(diào)
現(xiàn)在調(diào)用 CallbackManager.Factory.create,創(chuàng)建 callbackManager,以便處理登錄響應(yīng)。
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();
}
}
注意:如果應(yīng)用沒有發(fā)布的話,只有開發(fā)者和測試者可以訪問,因為是測試的賬號發(fā)布了幾次還是失敗,所以暫時還未發(fā)布。