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;
}