Android——第三方Facebook授權(quán)登錄獲取用戶信息

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

Facebook.gif

遵循以下步驟將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)信息輸入以下代碼片段。
微信截圖_1.png

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
  1. 在您的項目中,打開your_app > Gradle腳本> build.gradle(Project),確保以下存儲庫都添加到buildscript { repositories {}}中:
jcenter () 
  1. 在您的項目中,打開your_app > Gradle腳本> build.gradle(模塊:app)依次執(zhí)行語句添加到dependencies{}部分,踩依賴于最新版的Facebook登錄SDK:
implementation 'com.facebook.android:facebook-login:[8.1)'
  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) {
        }
微信截圖_2.png

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ā)布。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內(nèi)容