Facebook login for Android application -アンドロイドアプリにFacebookログイン認証を実装-

庭にキッカー作ろうとしたら屋根から大量の雪が落ちてきて怖じ気づいたので、ビールとネットな週末。

はやりのfacebook認証の出会い系アプリでも作ろうかと( ་ ⍸ ་ )笑


ゴール:Facebookのログイン認証使ってログインとログアウトだけできる状態にする
前提:android開発環境あること

1. https://developers.facebook.com/ の上のApps -> Create a new app
App IDは後でアプリ側に記述するからメモっとく

2. ターミナルで下記コマンド打ってハッシュキー取得(windowsの場合opensslいれないといけないかも)
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

パスワード聞かれたら、 android

このキーを1. のsettingのところに登録

3. Facebook SDKを https://developers.facebook.com/docs/android/ から落としてeclipseにインポート

4. アプリのプロジェクトを作る(1. で登録したActivity名、アプリ名と一致しないといけない)

5. プロジェクトで右クリ-> プロパティ -> android -> ライブラリ ->  Add -> Facebook SDKを追加

要は、http://y-anz-m.blogspot.jp/2013/11/androidfacebook-sdk-share.html の
1-7 から6を除いた手順と一緒。 (6のマニフェストの記述はこのページのじゃ足りないから飛ばして後回し)

--------- ここまで準備で、ここから実装 ---------

6.  https://developers.facebook.com/docs/android/login-with-facebook に沿ってコーディングしていけばできる。 やった結果をサマるとこんな感じ

6-0 AndroidManifest.xml

6-0-1 applicationタグ 内に下記追加
<activity android:name="com.facebook.LoginActivity"/>

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

※ 1. で取得したApp IDを strings.xmlに定義しておく(別にManifest直書きでもいいけど)

6-0-2 manifestタグ 内に下記追加 (無かったら)
<uses-permission android:name="android.permission.INTERNET"/>


6-1 activity_main.xml(レイアウト。名前は適宜) をこうする↓
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.facebook.widget.LoginButton
        android:id="@+id/authButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
        />


</LinearLayout>


6-2 MainActivity (名前は適宜)

6-2-1 プライベート変数追加
private MainFragment mainFragment;

6-2-2 onCreate() をこうする
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
        // Add the fragment on initial activity setup
        mainFragment = new MainFragment();
        getSupportFragmentManager()
        .beginTransaction()
        .add(android.R.id.content, mainFragment)
        .commit();
    } else {
        // Or set the fragment from restored state info
        mainFragment = (MainFragment) getSupportFragmentManager()
        .findFragmentById(android.R.id.content);
    }

}

6-3 MainFragment (名前は適宜)
6-3-1 Fragment を継承した MainFragmentクラスを作る こう↓
※Flagmentの選択肢が複数あるときは android.support.v4.app.Fragment; を使う。
クラスのインポートは適宜。

public class MainFragment extends Fragment {
private static final String TAG = "MainFragment";
private UiLifecycleHelper uiHelper;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    uiHelper = new UiLifecycleHelper(getActivity(), callback);
    uiHelper.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, 
        ViewGroup container, 
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_main, container, false);

    LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
    authButton.setFragment(this);
   
    return view;
}
@Override
public void onResume() {
    super.onResume();
   
    Session session = Session.getActiveSession();
    if (session != null &&
          (session.isOpened() || session.isClosed()) ) {
        onSessionStateChange(session, session.getState(), null);
    }
   
    uiHelper.onResume();
}

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

@Override
public void onPause() {
    super.onPause();
    uiHelper.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);
}
private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        onSessionStateChange(session, state, exception);
    }
};
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        Log.i(TAG, "Logged in...");
    } else if (state.isClosed()) {
        Log.i(TAG, "Logged out...");
    }
}