22

Facebook と統合する Android アプリを開発しています。私はしたいと思います:

  1. ユーザーが Facebook でログインできるようにする
  2. Facebook でユーザーのメール アドレスを取得します (プロキシされたメール アドレスでもかまいませんが、これで問題ありません)。
  3. ユーザーに代わってユーザーのウォール/タイムラインに投稿する

技術的には、次のようになります。

  1. ユーザーを認証する
  2. 許可を求めるemail
  3. 許可を求める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;
    }

    /* ... */
}

oldStatenewStateが等しいので(どちらもSessionState.OPENED_TOKEN_UPDATEDであるため、コールバックは呼び出されません。

質問

2回目の許可が下りた後、どのように通知を受け取ることができますか? close()セッションをキャッシュから再度開くことになっていますか?

追加情報

My Facebook Android SDK 3.0 は、ここからダウンロードできます。これは、Facebook のGetting Started with the Facebook SDK for Android に記載されています。

4

3 に答える 3

10

これはバグです。

[編集: Guy がコメントで指摘しているように、これは 3.0.1 で修正されたため、この回避策は不要になりました]

close を呼び出す必要はありませんが、言及した回避策は基本的に正しいです。単一のアクティブなセッションを使用している場合は、requestNewPublishPermissions() を呼び出す前に次のように呼び出します。

Session.openActiveSessionFromCache(myContext);

複数のセッションを使用している場合は、TokenCachingStrategy で新しいセッションを初期化し、それが CREATED_TOKEN_LOADED 状態であることを確認して、openForRead(null) を呼び出す必要があります。

これらのいずれかを実行した後、requestNewPublishPermissions() は完了後に通知を呼び出す必要があります。

于 2012-12-26T22:15:39.173 に答える
2

rightparenの答えに基づく作業コード

2回目(つまり前Session.requestNewPublishPermissions())に許可を要求する前に、次のようにします。

// Re-initialize Facebook session.
session.removeCallback(sessionStatusCallback);          // Remove callback from old session.
session = Session.openActiveSessionFromCache(context);  // Create new session by re-opening from cache.
session.addCallback(sessionStatusCallback);             // Add callback to new session.

質問のように、コードはまだFacebook AndroidSDK3.0に基づいています。

于 2013-01-16T02:28:53.313 に答える