読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

facebookを使ったアプリログインの実装

概要

facebook SDKを使ってfacebookを使ったアプリログイン機能を実装する

まとめ

Androidにサンプルがおいてあるのでそれを参考に実装。
ログインのサンプル(SessinLoginSample)プロジェクトには以下の三つの方法が提示されている。

  • activityからのログイン
  • fragmentからのログイン
  • UserSettingsFragmentを使ったログイン

今回は三つ目の「UserSettingsFragmentを使ったログイン」で実装する(理由は後述

facebook側の設定はFacebook SDKを使ってシェアする - うさがにっきの記事を参照

AndroidManifest.xml

<activity android:name="com.facebook.LoginActivity"
          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" />

loginするためのFacebookSDKのActivityとappidを登録する


layout

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">

    <fragment android:layout_height="fill_parent"
              android:layout_width="fill_parent"
              android:id="@+id/login_fragment"
              android:name="com.facebook.widget.UserSettingsFragment" />
</LinearLayout>

画面にandroid:name="com.facebook.widget.UserSettingsFragment"のフラグメントを配置しただけ


activity

private UserSettingsFragment userSettingsFragment;

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

    setContentView(R.layout.login_fragment_activity);

    FragmentManager fragmentManager = getSupportFragmentManager();
    userSettingsFragment = (UserSettingsFragment) fragmentManager.findFragmentById(R.id.login_fragment);
    userSettingsFragment.setSessionStatusCallback(new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            // Session状態が変わったときにcall、ここでログイン処理などを行う
        }
    });
}

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

UserSettingsFragmentはfacebook SDKが提供するログイン、ログアウトボタンが配置されているfragment
ログインしている場合必要な情報をsessionに設定しておいてくれるのでcallメソッドを必要に応じてoverrideする
クラスの詳しい情報は参考から

補足

なぜ三つのうち、この方法をとったかというと、ほかの二つのやり方だとアプリでログイン後、facebook側でアプリを削除したときのエラーハンドリングが難しそうだったから
本来であれば、facebook側でアプリを削除した時点で再度ログインを促してほしいところなのだが、ほかの二つのやり方では削除前のsessionを保持し続けて再度ログイン画面が開かれなかった(特別なエラーも発生しないため原因追及に時間がかかった…
唯一、ちゃんとfacebook側でアプリを削除した場合アプリ側にも反映されたのが今回のUserSettingFragmentを使ったやり方だった