Facebook 原生登錄

準(zhǔn)備工作

1.首先去Facebook的開發(fā)者平臺(tái) https://developers.facebook.com 注冊(cè)賬號(hào), 創(chuàng)建app,獲取到app的應(yīng)用編號(hào)和秘鑰

Paste_Image.png

2.創(chuàng)建Android平臺(tái),里面需要輸入包名,類名和秘鑰散列, 包名就是你的項(xiàng)目包名com.xxx.xxx,這個(gè)不用多說, 類名里面提示的MainActivity的全路徑,就好比com.xxx.xxx.MainActivity

Paste_Image.png

至于秘鑰散列這個(gè),獲取的話可以下載一個(gè)叫FbHashCal的apk去生成,前提是你的app是要簽名了才能生成,不過生成后不能copy,這個(gè)比較頭疼,而且手動(dòng)輸入的話難免會(huì)出錯(cuò),我就踩過這個(gè)坑~~,不過沒關(guān)系,還有更方便的保證能copy的,就是用代碼生成,不多說,上代碼

 //獲取facebook所需的密鑰散列
        try {
            PackageInfo info = getPackageManager().getPackageInfo("包名", PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                showLog("KEYHASH------" + Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {

        } catch (NoSuchAlgorithmException e) {

        }

創(chuàng)建好這些平臺(tái)所必須的東西之后,接下來就擼碼了~~

項(xiàng)目代碼部分

首先先導(dǎo)入Facebook的依賴庫(kù) compile 'com.facebook.android:facebook-android-sdk:[4,5)' 可以去下載最新的, 并進(jìn)行初始化,建議不用在application初始化,在你登錄調(diào)用前的oncreate()中初始化就可以了,F(xiàn)acebookSdk.sdkInitialize(context); 記得要加上網(wǎng)絡(luò)權(quán)限

  1. AndroidManifest.xml 配置
    facebook_app_id就是平臺(tái)項(xiàng)目的應(yīng)用編號(hào), fb_login_protocol_scheme這個(gè)是在你的平臺(tái)項(xiàng)目的應(yīng)用編號(hào)前加個(gè)fb,例如fbxxxxxx, 至于那個(gè)FacebookContentProvider這個(gè)是為了在你手機(jī)沒有安裝Facebook客戶端的時(shí)候,允許訪問網(wǎng)頁端進(jìn)行登錄
    FacebookContentProviderxxx中的xxx是應(yīng)用編號(hào)
<!--facebook原生登錄分享-->
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id" />
        <provider
            android:name="com.facebook.FacebookContentProvider"
            android:authorities="com.facebook.app.FacebookContentProviderxxx"
            android:exported="true" />

        <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>
 <string name="facebook_app_id">應(yīng)用編號(hào)</string>
    <string name="fb_login_protocol_scheme">fb應(yīng)用編號(hào)</string>

2.官方文檔提供的是使用LoginButton, 不過我們大部分都是用自己的View, 兩種登錄的方式不一樣的,我是用了自己的登錄View, 在oncreate方法中初始化CallbackManager, 并調(diào)取注冊(cè)回調(diào)

 callbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                getFbLoginInfo(loginResult.getAccessToken());
            }

            @Override
            public void onCancel() {
                showTs("cancel");
                CookieSyncManager.createInstance(LoginActivity.this);
                CookieManager cookieManager = CookieManager.getInstance();
                cookieManager.removeAllCookie();
                CookieSyncManager.getInstance().sync();
            }

            @Override
            public void onError(FacebookException error) {
                showTs("error");
            }
        });
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

點(diǎn)擊登錄按鈕,首先獲取token和profile,如果為空的則說明讀取過Facebook的權(quán)限授權(quán),這時(shí)候則需要去讀取相關(guān)權(quán)限,否則直接獲取用戶信息進(jìn)行登錄

case tv_facebook:
                //判斷當(dāng)前token,如果不為空,則已經(jīng)獲取過權(quán)限,否則讀取權(quán)限走registerCallback回調(diào)
                AccessToken accessToken = AccessToken.getCurrentAccessToken();
                Profile profile = Profile.getCurrentProfile();
                if (accessToken == null || accessToken.isExpired() || profile == null) {
                    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile, email, user_birthday, user_friends"));
                } else {
                    getFbLoginInfo(accessToken);
                }
                break;

獲取用戶的信息需要用解析下

 /**
     * 獲取Facebook個(gè)人信息
     */
    public void getFbLoginInfo(AccessToken accessToken) {
        GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                if (object != null) {
                    String id = object.optString("id");
                    String name = object.optString("name");
                    String gender = object.optString("gender");  //性別
                    String email = object.optString("email");
                    //獲取用戶頭像
                    JSONObject object_pic = object.optJSONObject("picture");
                    JSONObject object_data = object_pic.optJSONObject("data");
                    String photo = object_data.optString("url");
                    //獲取地域信息
                    String locale = object.optString("locale");   //zh_CN 代表中文簡(jiǎn)體
                    showLog("fb profile---" + "id---" + id + "---name----" + name + "--gender---" + gender + "----email---" + email + "---photo---" + photo + "----locale---" + locale);
                    getP().doLoginByOauth(id, name, photo, "2");
                }
            }
        });

        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name");
        request.setParameters(parameters);
        request.executeAsync();
    }
 @Override
    protected void onResume() {
        super.onResume();
        // FaceBook Logs 'install' and 'app activate' App Events.
        AppEventsLogger.activateApp(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // FaceBook Logs 'app deactivate' App Event.
        AppEventsLogger.deactivateApp(this);
    }

好了,真?zhèn)€流程基本就完成了,有什么不對(duì)或者需要改進(jìn)的,希望大家多多提出來大家討論~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評(píng)論 25 709
  • 噼里啪啦的炸裂聲瞬間侵染了這片本就荒蕪的土地。響徹在這一馬平川地界上的風(fēng)雨,哪怕是一座破廟,大概也是極難得...
    Jan_C閱讀 1,012評(píng)論 0 1
  • 世界上有許多美麗的風(fēng)景,興許是浩翰的天空中一閃而過的流星,興許是廣闊大海中波濤洶涌的景象,興許是花叢中穿過的蝴蝶...
    顧長(zhǎng)旭閱讀 340評(píng)論 0 1
  • 他們只能到這兒了。 每想及此事,他總有種說不出的沮喪,也曾想過努力挽回,卻又深深地明白:他們終究只能到這兒了。 作...
    灰雪閱讀 2,845評(píng)論 40 59

友情鏈接更多精彩內(nèi)容