AndroidアプリにFacebookのSDKアカウントでのログインを実装する案件が有り、備忘録として残しておきます。

Android StudioでFacebook SDKを使う準備

まずはFacebookのSDKをインストールする必要がありますが、Android Studioを使えば、Gradleで簡単にセットアップが可能です。
まず、プロジェクトを作成し(注:Android 4.0.3以上)、プロジェクトの「Gradle Script」の「build.gradle(Module:app)」を開きます。
そこに dependencies と書かれている部分がありますが、その上に以下を記述します。

repositories {
    mavenCentral()
}

また、dependenciesの {} 内にも以下を記述します。

compile 'com.facebook.android:facebook-android-sdk:[4,5)'

結果、dependenciesは以下のようになります。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
}

変更すると、Android Studio 上部の通知バーが現れると思います。
右上の「Sync Now」で自動的にプロジェクトにインポートしてくれるようになっています。

そうすればプロジェクトからFaceBook SDKが参照できるようになっていますので、Activity等のFaceBook SDKを使用するJavaファイルでFacebook SDKをインポートしてみましょう。

import com.facebook.FacebookSdk;

Facebookアプリの登録

Facebookでログインを実装には FaceBook App の登録が必要です。FaceBook Developersからアプリの登録を行う必要があります。
FaceBook Developers

fb-1

画面右上の「My Apps」から「Add a New App」で「Android」を選択します。
アプリ名を入力し「Create new Facebook App ID」でアプリを作成します。
「Skip Quick Start」でアプリの管理画面が表示され、AppIdが表示されています。

「Setting」を選択し「+Add Platform」で「Android」を追加します。

fb2
「Google Play Package Name」にはパッケージ名を、「Class Name」にはFaceBookログインを行うアクティビティのクラスの名前を、登録します。

  パッケージ名例 : com.example.app
  クラス名例 : com.example.app.MainActivity

「Key Hashes」にはハッシュキーを登録しますがこのハッシュキーは以下のようなコマンドで得ます(デバッグ版の例)。

keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64

opensslが無い場合にはインストールしてpathを設定して下さい。

マニフェストの修正

まずFacebookのAppIdを定数として設定ファイルに保存しましょう。strings.xml に登録しておきます。

<string name="facebook_app_id">123456789</string>

そして、AndroidManifest.xml を開き、applicationタグの内部で以下を記述します。
これによりFacebookサーバ上のアプリIDが紐付けられます。

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>

ついでにログイン用のActivityを使うので、これもマニフェストに登録しておきます。

<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" />

もちろん、インターネット接続を行いますのでインターネット接続のpermissionを忘れずに記述します。(applicationタグの外)

   <uses-permission android:name="android.permission.INTERNET"/>

ログイン処理の画面と準備

ここではActivityでログインボタンを押してログイン画面に進み、ログイン処理を行うように作成します。まず、画面のデザインですがTextViewを1つと、ログインボタンを1つ配置します。TextViewはIDを textView1 とします。

ログインボタンは com.facebook.login.widget.LoginButton で記述することでFacebook用のボタンが表示されます。
これはFaceBookで用意されたコンポーネントで誰が見てもFaceBookのイイネだと分かるボタンです。

<com.facebook.login.widget.LoginButton
   android:id="@+id/login_button"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content" />

では、JavaのActivityクラスを記述していきます。まずはクラスのフィールドとして画面のTextViewとLoginボタンを宣言しておきます。

	private TextView textView1;
	private LoginButton loginButton;

次にCallbackManagerクラスを入れる変数を用意します。これはFacebookサーバからのコールバックを管理するクラスです。

	private CallbackManager callbackManager;

ログイン処理の実際

では、onCreate内で実際の処理を見ていきます。まずはFacebook SDKの初期化を行うsdkInitializeをsetContentViewの前で行います。これを事前に行っておかないとログインボタンの表示ができず強制終了となります。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_main);

次にTextViewとログインボタンを取得しておきます。

        textView1 = (TextView)findViewById(R.id.textView1);
        loginButton = (LoginButton) findViewById(R.id.login_button);

そして、CallbackManagerのインスタンスを生成します。これは以下のように行います。

        callbackManager = CallbackManager.Factory.create();

また、ログインボタンに権限を設定します。今回は「user_friends」として友達リストまで取得できる権限にしています。

        loginButton.setReadPermissions("user_friends");

次にログイン後のコールバック処理です。loginButtonにregisterCallbackでコールバッククラスを登録します。コールバッククラス内では onSuccess でログイン成功時の処理、onCancel でログインキャンセル時の処理、onError でエラー時の処理を記述します。

        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                textView1.setText(loginResult.getAccessToken().getUserId());
            }

            @Override
            public void onCancel() {
                textView1.setText("Cancel");
            }

            @Override
            public void onError(FacebookException exception) {
                textView1.setText("Error:" + exception);
            }
        });

    }

ここではログイン成功時にユーザIDを取得し、TextViewに設定しています。

コールバック処理

onCreate以外にonActivityResultでも処理を行う必要があります。Facebookログインを行うアクティビティを閉じたあとにこのメソッドに戻ってくるからです。ここで、callbackManagerに引数を渡しておきます。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

ユーザ名の取得

ユーザ名の取得にはProfileTrackerを使います。これはFacebookのログイン情報を監視し、変更があったときに処理を行うことができます。まずはクラスのフィールドとしてProfileTrackerを宣言します。

	ProfileTracker profileTracker;

次にonCreate内でインスタンスを生成します。このとき、onCurrentProfileChanged内でログイン情報が変更になった際の処理を記述します。onCurrentProfileChangedには変更前の情報である oldProfile と変更後の情報である currentProfile が引数で渡されますので、ここでは currentProfile をチェックしています。

currentProfile が null の場合、ログアウトしています。そうでない場合、Profileクラスのメソッドを使ってユーザの情報を取得します。ここではgetNameを使ってユーザの名前を取得し、TextViewに表示しています。

        profileTracker = new ProfileTracker() {
            @Override
            protected void onCurrentProfileChanged(
                    Profile oldProfile,
                    Profile currentProfile) {
                if (currentProfile==null){
                    textView1.setText("(ログアウト)");
                }else {
                    textView1.setText(currentProfile.getName());
                }
            }
        };

まとめ

当たり前に行うと思いますが、FaceBook IDを保存しておいて次回から自動的にログインするなどの処理を加えると思いますし
会員データはサーバーで管理するアプリも多いでしょうから、サーバー側でAccessTokenの検証処理も発生してきます。
次回はその辺りに触れられればと思っています。