Facebook と統合する Android アプリを開発しています。私はしたいと思います:
- ユーザーが Facebook でログインできるようにする
- Facebook でユーザーのメール アドレスを取得します (プロキシされたメール アドレスでもかまいませんが、これで問題ありません)。
- ユーザーに代わってユーザーのウォール/タイムラインに投稿する
技術的には、次のようになります。
- ユーザーを認証する
- 許可を求める
email
- 許可を求める
publish_stream
1. ユーザーを認証する
で呼び出しSession.openActiveSession()
ましたSession.StatusCallback
(アクティブな開いているセッションがないことを事前に確認しました):
final Session.StatusCallback sessionStatusCallback = new Session.StatusCallback() {
public void call(final Session session, SessionState state, Exception exception) {
// If there is an exception...
if(exception != null)
{
// Handle fail case here.
return;
}
// If session is just opened...
if(state == SessionState.OPENED)
{
// Handle success case here.
return;
}
};
};
// Start Facebook Login.
Session.openActiveSession(activity, true, sessionStatusCallback);
ログインが成功すると、コールバックが呼び出されます。ここまでは順調ですね。
2.email
許可を求める
これは私のステータスコールバックです:
new Session.StatusCallback() {
public void call(final Session session, SessionState state, Exception exception) {
// If there is an exception...
if(exception != null)
{
// Handle fail case here.
return;
}
// If token is just updated...
if(state == SessionState.OPENED_TOKEN_UPDATED)
{
// Handle success case here.
return;
}
};
};
私は許可を要求しSession.requestNewReadPermissions()
ます:
final Session session = Session.getActiveSession();
final static String[] PERMISSION_ARRAY_READ = {"email"};
final List<String> permissionList = Arrays.asList(PERMISSION_ARRAY_READ);
// If all required permissions are available...
if(session.getPermissions().containsAll(permissionList))
{
// Handle success case here.
return;
}
// Request permissions.
session.requestNewReadPermissions(new Session.NewPermissionsRequest(activity, permissionList));
パーミッションが付与された後にコールバックが呼び出されます。ここまでは順調ですね。
3.publish_stream
許可を求める
これは私のステータスコールバックです:
new Session.StatusCallback() {
public void call(final Session session, SessionState state, Exception exception) {
// If there is an exception...
if(exception != null)
{
// Handle fail case here.
return;
}
// If token is just updated...
if(state == SessionState.OPENED_TOKEN_UPDATED)
{
// Handle success case here.
return;
}
};
};
私は許可を要求しSession.requestNewPublishPermissions()
ます:
final Session session = Session.getActiveSession();
final static String[] PERMISSION_ARRAY_PUBLISH = {"publish_stream"};
final List<String> permissionList = Arrays.asList(PERMISSION_ARRAY_PUBLISH);
// If all required permissions are available...
if(session.getPermissions().containsAll(permissionList))
{
// Handle success case here.
return;
}
// Request permissions.
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(activity, permissionList));
今回は、パーミッションが付与された後にコールバックが呼び出されません。
調査
さらに調査したところ、コールバックがcom.facebook.Session#postStateChange(SessionState, SessionState, Exception)
次のようにトリガーされていることがわかりました。
void postStateChange(final SessionState oldState, final SessionState newState, final Exception exception) {
if (oldState == newState && exception == null) {
return;
}
/* ... */
}
oldState
とnewState
が等しいので(どちらもSessionState.OPENED_TOKEN_UPDATED
であるため、コールバックは呼び出されません。
質問
2回目の許可が下りた後、どのように通知を受け取ることができますか? close()
セッションをキャッシュから再度開くことになっていますか?
追加情報
My Facebook Android SDK 3.0 は、ここからダウンロードできます。これは、Facebook のGetting Started with the Facebook SDK for Android に記載されています。