目次

v3.23.0 - Feb 5, 2015 現在 — 宗 昂志 2015/02/18 15:08

ログイン処理

※SDKのダウンロートとかFacebook Devの設定は省いてます。

以下のようなログインボタンの実装です。
こちらで使用しているボタンはSDKに組み込まれているログインボタンになります。

ログインが完了すると、以下のようにボタンが切り替わります。
SDKのボタンを使用する場合、ボタンの切り替え処理はSDKが行っているようなので、特に必要はなさそうです。
もし自分でボタンを作成したい場合は、Session状態を見ながら切り替える必要があります。

AndroidManifest.xml

permissionとmeta-dataを追加します。

<uses-permission android:name="android.permission.INTERNET" />
<activity android:name="com.facebook.LoginActivity" />
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_appId" />

string.xml

<string name="facebook_appId">appid</string>

activity_main.xml

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

MainActivity.java

  public class MainActivity extends Activity {
  
      private final static String TAG = MainActivity.class.getSimpleName();
  
      private UiLifecycleHelper uiHelper;
  
      private Session.StatusCallback callback = new Session.StatusCallback() {
          @Override
          public void call(Session session, SessionState state, Exception exception) {
              onSessionStateChange(session, state, exception);
          }
      };
  
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
  
          uiHelper = new UiLifecycleHelper(this, callback);
          uiHelper.onCreate(savedInstanceState);
  
          // ログインボタン(認証ボタン)
          LoginButton authButton = (LoginButton) findViewById(R.id.btn_auth);
          authButton.setPublishPermissions(Arrays.asList("publish_actions"));
      }
  
      private void onSessionStateChange(Session session, SessionState state, Exception exception) {
          if (state.isOpened()) {
          } else if (state.isClosed()) {
          }
      }
  
      @Override
      public void onResume() {
          super.onResume();
          uiHelper.onResume();
          Session session = Session.getActiveSession();
          Log.d("Session state:", ""+session.getState());
      }
  
      @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);
      }
  }

Session状態を見て処理をハンドリング

何らかの処理を行う前にSession状態を確認して、最適な処理を行う必要がありそうです。
コード例ですが、あくまで一例です。もっといい書き方がありそう…
https://developers.facebook.com/docs/reference/android/current/class/SessionState/

Session session = Session.getActiveSession();
if(session.isOpened()) {
  // 認証済み: OPENED / OPENED_TOKEN_UPDATE
  
  /**
  * 投稿処理
  */

} else {
  // OPENING / CREATED / CREATED_TOKEN_LOADED / CLOSED_LOGIN_FAILED / CLOSED
  
  if (session.getState().equals(SessionState.CLOSED_LOGIN_FAILED) || session.getState().equals(SessionState.CLOSED)) {
      // 認証失敗・クローズ済み: CLOSED_LOGIN_FAILED / CLOSED
      // Sessionの再生成
      session = new Session(this);
  }
  // リクエストの生成
  Session.OpenRequest openRequest = new Session.OpenRequest(this).setCallback(callback);
  // emailを要求するパーミッションを設定
  openRequest.setPermissions(Arrays.asList("email"));
  // アクティブセッションとする
  Session.setActiveSession(session);
  // 認証を要求する
  session.openForRead(openRequest);
  
  /**
  * 認証処理 
  * ここでSDKの認証処理が走ります。
  * FBアプリが入っているならばアプリが起動。
  * 入っていなければモーダルのダイアログが起動。
  */

  /**
  * 認証が終わった際に続けて投稿処理を行う場合、フラグを持たせておき
  * onSessionStateChangeでSessionStateを見て投稿処理を行う。
  * (ここはもうちょっと良い方法がありそう…)
  */
  // Session状態が変化したときに投稿処理を行うフラグ
  mDoPost = true; 
  
}