最近项目需要使用Facebook登陆。在做完之后于是就像总结下,方便后来人使用。Facebook需要翻墙才能登陆。网上有好多翻墙软件和教程,大家可以先去看看。

使用Facebook登陆首需要去https://developers.facebook.com Facebook开发者平台上去注册一个开发者账号,可以使用Facebook账号登陆。

注册完成之后点击My Apps菜单选项下Add a New App 创建一个新的项目。

Android集成facebook登录 facebook如何登录安卓_Android


选择你需要的接入的类型:

Android集成facebook登录 facebook如何登录安卓_Android_02


这里以选择Android教程为例。选择Android以后根据Facebook提供的步骤填写资料就可以完成初期准备,完成之后的结果。

Android集成facebook登录 facebook如何登录安卓_hash_03


在这里值得注意点是Hashes值,这里稍微有点坑,

Android集成facebook登录 facebook如何登录安卓_登陆注销_04


这里描述下Development key Hashes值就是Debug模式下哈希值,下面Release Key Hash就是正式签名打包以后的哈希值。

在onCreate方面里面打印当前哈希值

/**
     * 获取hash值
     */
    private void getKeyHash() {
        try {
            PackageInfo info = getPackageManager().getPackageInfo("你的包名",PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                DebugLogs.e("KeyHash:" + Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {
            //something
        } catch (NoSuchAlgorithmException e) {
            //something
        }
    }

Development key Hashes生成方式。
Development key Hashes生成方式相对简单直接 将下面命令复制到命令里面运行就可以了。Mac开打终端 输入下面命令行,这时会要求输入密钥库口令。就是默认口令‘Android’就好了。Window同理。

for mac生成方式:keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

for windows :keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
以上就是生成dubug模式下的哈希值。

Release Key Hash正式:
需要生成签名密钥debug.keystore。密钥生成完毕以后打开终端输入:keytool -exportcert -alias 名称 -keystore C:\Users\Tom\.android\debug.keystore | openssl sha1 -binary | openssl base64
-alias 后面紧接着就是名称
-keystore 存放keystore路径,
直接运行,输入debug.keystore的密钥口令就可以获得正式签名包得hash值,到这里算是完成了一半。

接下来就是接入SDK的过程,在上面申请Appid 的流程里面第一步就是需要你下载一个SDK这个时候,就可以使用了。我们新建自己的项目。然后将sdk作为lib项目导入自己项目中只需要Facebook这个项目就可以了。
首先我们看 androidMainfest.xml文件

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
...
<activity android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:label="@string/app_name" />
        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
        <meta-data android:name="com.facebook.sdk.ApplicationName"
            android:value="@string/facebook_app_name" />
        <provider android:authorities="com.facebook.app.FacebookContentProvider这里填写app_id"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="true"/>

这里注意两个地方就好了。app_id填写, app_id最好在String.xml文件里。
登陆按钮。

<com.facebook.login.widget.LoginButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_gravity="center_horizontal"
        facebook:com_facebook_confirm_logout="false"
     facebook:com_facebook_tooltip_mode="never_display" />

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:facebook="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <com.facebook.login.widget.LoginButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_gravity="center_horizontal"
        facebook:com_facebook_confirm_logout="false"
        facebook:com_facebook_tooltip_mode="never_display" />

    <TextView
        android:id="@+id/info_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:textColor="@android:color/black"
        android:gravity="center" />

    <com.facebook.login.widget.ProfilePictureView
        android:id="@+id/profilePicture"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:gravity="center_horizontal"
        android:layout_marginBottom="10dp"
        facebook:com_facebook_preset_size="normal" />
</LinearLayout>

MainActivity.java

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.util.Base64;
import android.widget.TextView;

import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.Profile;
import com.facebook.ProfileTracker;
import com.facebook.appevents.AppEventsLogger;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.ProfilePictureView;

import net.dev.mylib.DebugLogs;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public class MainActivity extends Activity {
    private CallbackManager callbackManager;
    private ProfileTracker profileTracker;
    private TextView info = null;
    private ProfilePictureView profilePictureView;//图片控件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(this.getApplicationContext());
        getKeyHash();
        callbackManager = CallbackManager.Factory.create();//创建回调工厂
        //登陆成功以后回调
        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        updateUI();
                    }

                    @Override
                    public void onCancel() {
                        updateUI();
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        DebugLogs.e("-----onError----->" + exception);
                        updateUI();
                    }

                });
        setContentView(R.layout.activity_main);
        profilePictureView = (ProfilePictureView)findViewById(R.id.profilePicture);
        info = (TextView)findViewById(R.id.info_text);
        //刷新获取个人用户资料
        profileTracker = new ProfileTracker() {
            @Override
            protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
                updateUI();
                //It`s possible that we were waiting for Profile to be populated in order to post a status update.
            }
        };


        DebugLogs.e(getResources().getConfiguration().locale.getCountry());
    }

    /**
     * 获取hash值
     */
    private void getKeyHash() {
        try {
            PackageInfo info = getPackageManager().getPackageInfo("com.anykey.balala",PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                DebugLogs.e("KeyHash:" + Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {
            //something
        } catch (NoSuchAlgorithmException e) {
            //something
        }
    }

    //UpdateUi()
    private void updateUI(){
        boolean enableButton = AccessToken.getCurrentAccessToken() != null;
        Profile profile = Profile.getCurrentProfile();//获取登陆成功以后的数据
        if (enableButton && profile != null) {
            info.setText(profile.toString()+"\n"+"成功以后的获取ID---->:"+profile.getId()+"\n"+"成功后的获取信息:" +profile.getLastName() + profile.getFirstName()+"\n头像"+ profile.getProfilePictureUri(50,50));
            profilePictureView.setProfileId(profile.getId());
            DebugLogs.e("成功以后的获取ID---->:" + profile.getId());
            DebugLogs.e("成功后的获取信息getFirstName:" + profile.getFirstName());
            DebugLogs.e("成功后的获取信息getMiddleName:" + profile.getMiddleName());
            DebugLogs.e("成功后的获取信息getName:" + profile.getName());
            DebugLogs.e("成功后的获取信息getLinkUri:" + profile.getLinkUri());
        } else {
            DebugLogs.e("获取信息失败");
        }
    }
    //接受回调
    @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();
        // Logs 'install' and 'app activate' App Events.
        AppEventsLogger.activateApp(this);
    }

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

    @Override
    protected void onDestroy() {
        super.onDestroy();
        profileTracker.stopTracking();
    }
}

完成以上步骤基本可以实现Facebook登陆与注销。祝大家写代码愉快