v3.23.0 - Feb 5, 2015 現在 --- //[[sou@mss-g.co.jp|宗 昂志]] 2015/02/18 15:08// ===== ログイン処理 ===== ※SDKのダウンロートとかFacebook Devの設定は省いてます。 以下のようなログインボタンの実装です。\\ こちらで使用しているボタンはSDKに組み込まれているログインボタンになります。 {{:device-2015-02-19-154813.png?nolink&300|}} ログインが完了すると、以下のようにボタンが切り替わります。\\ SDKのボタンを使用する場合、ボタンの切り替え処理はSDKが行っているようなので、特に必要はなさそうです。\\ もし自分でボタンを作成したい場合は、Session状態を見ながら切り替える必要があります。\\ {{:device-2015-02-19-171150.png?nolink&300|}} ==== AndroidManifest.xml ==== permissionとmeta-dataを追加します。 ==== string.xml ==== appid ==== activity_main.xml ==== ==== 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; }