Facebook 原生登錄

準備工作

1.首先去Facebook的開發(fā)者平臺 https://developers.facebook.com 注冊賬號刹衫, 創(chuàng)建app,獲取到app的應用編號和秘鑰

Paste_Image.png

2.創(chuàng)建Android平臺口糕,里面需要輸入包名缅阳,類名和秘鑰散列, 包名就是你的項目包名com.xxx.xxx景描,這個不用多說十办, 類名里面提示的MainActivity的全路徑,就好比com.xxx.xxx.MainActivity

Paste_Image.png

至于秘鑰散列這個超棺,獲取的話可以下載一個叫FbHashCal的apk去生成向族,前提是你的app是要簽名了才能生成,不過生成后不能copy棠绘,這個比較頭疼件相,而且手動輸入的話難免會出錯,我就踩過這個坑~~氧苍,不過沒關系夜矗,還有更方便的保證能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)建好這些平臺所必須的東西之后,接下來就擼碼了~~

項目代碼部分

首先先導入Facebook的依賴庫 compile 'com.facebook.android:facebook-android-sdk:[4,5)' 可以去下載最新的澄干, 并進行初始化逛揩,建議不用在application初始化柠傍,在你登錄調用前的oncreate()中初始化就可以了,F(xiàn)acebookSdk.sdkInitialize(context); 記得要加上網絡權限

  1. AndroidManifest.xml 配置
    facebook_app_id就是平臺項目的應用編號辩稽, fb_login_protocol_scheme這個是在你的平臺項目的應用編號前加個fb惧笛,例如fbxxxxxx, 至于那個FacebookContentProvider這個是為了在你手機沒有安裝Facebook客戶端的時候,允許訪問網頁端進行登錄
    FacebookContentProviderxxx中的xxx是應用編號
<!--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">應用編號</string>
    <string name="fb_login_protocol_scheme">fb應用編號</string>

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

 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);
    }

點擊登錄按鈕喷众,首先獲取token和profile各谚,如果為空的則說明讀取過Facebook的權限授權,這時候則需要去讀取相關權限到千,否則直接獲取用戶信息進行登錄

case tv_facebook:
                //判斷當前token昌渤,如果不為空,則已經獲取過權限憔四,否則讀取權限走registerCallback回調
                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個人信息
     */
    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 代表中文簡體
                    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)€流程基本就完成了,有什么不對或者需要改進的了赵,希望大家多多提出來大家討論~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末潜支,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柿汛,更是在濱河造成了極大的恐慌冗酿,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件络断,死亡現(xiàn)場離奇詭異裁替,居然都是意外死亡,警方通過查閱死者的電腦和手機妓羊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門胯究,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躁绸,你說我怎么就攤上這事〕枷” “怎么了净刮?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硅则。 經常有香客問我淹父,道長,這世上最難降的妖魔是什么怎虫? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任暑认,我火速辦了婚禮困介,結果婚禮上,老公的妹妹穿的比我還像新娘蘸际。我一直安慰自己座哩,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布粮彤。 她就那樣靜靜地躺著根穷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪导坟。 梳的紋絲不亂的頭發(fā)上屿良,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音惫周,去河邊找鬼尘惧。 笑死,一個胖子當著我的面吹牛递递,可吹牛的內容都是我干的褥伴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼漾狼,長吁一口氣:“原來是場噩夢啊……” “哼重慢!你這毒婦竟也來了?” 一聲冷哼從身側響起逊躁,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤似踱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稽煤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體核芽,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年酵熙,在試婚紗的時候發(fā)現(xiàn)自己被綠了轧简。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡匾二,死狀恐怖哮独,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情察藐,我是刑警寧澤皮璧,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站分飞,受9級特大地震影響悴务,放射性物質發(fā)生泄漏。R本人自食惡果不足惜譬猫,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一讯檐、第九天 我趴在偏房一處隱蔽的房頂上張望羡疗。 院中可真熱鬧,春花似錦别洪、人聲如沸叨恨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽特碳。三九已至,卻和暖如春晕换,著一層夾襖步出監(jiān)牢的瞬間午乓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工闸准, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留益愈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓夷家,卻偏偏與公主長得像蒸其,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子库快,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,749評論 25 707
  • 噼里啪啦的炸裂聲瞬間侵染了這片本就荒蕪的土地义屏。響徹在這一馬平川地界上的風雨靠汁,哪怕是一座破廟,大概也是極難得...
    Jan_C閱讀 936評論 0 1
  • 世界上有許多美麗的風景闽铐,興許是浩翰的天空中一閃而過的流星蝶怔,興許是廣闊大海中波濤洶涌的景象,興許是花叢中穿過的蝴蝶...
    顧長旭閱讀 280評論 0 1
  • 他們只能到這兒了兄墅。 每想及此事踢星,他總有種說不出的沮喪,也曾想過努力挽回隙咸,卻又深深地明白:他們終究只能到這兒了沐悦。 作...
    灰雪閱讀 2,795評論 40 59