1

新しい Facebook SDK 3.0 for Android のフィード ダイアログの統合に問題があります。ドキュメントはそれを行う方法について非常に明確ですが、1つの非常に重要なケースを省略しています。これは、ほとんど起こらないかのように言及されているだけです.

Facebook フィード ダイアログのドキュメント

これは、ユーザーが何かを公開したいが、まだログインしておらず、セッションとアクセス トークンを持っていない場合です。

SDK は、古い Facebook オブジェクトにアクセス トークン (およびセッション全体) を設定する方法を提供しますが、ユーザーがログインしてフィード ダイアログを介してフィードを投稿した後、セッションまたはアクセス トークンを取得する方法が見つかりません。

したがって、フローは次のとおりです。

  1. ユーザーが共有ボタンを押します。
  2. 彼はログインしていないため、セッション アクセス トークンはありません
  3. facebook.dialog()が起動し、ログイン ダイアログが表示されます
  4. ユーザーがログインして自分のリンクを共有する
  5. 彼はアプリケーションに戻りましたが、まだセッション アクセス トークンを持っておらず、1 分前にログインしたにもかかわらず facebook にログインしていません。

私の質問は、ステップ 5 でアクセス トークンを取得し (これは確かにどこかで作成されます)、プログラムでそれを使用して有効な SDK 3.0 セッション オブジェクトを作成し、ユーザーが使用後にアクセス トークンを使用して有効なセッションを持つことができるようにする方法です。 Facebookのダイアログ?

- - 編集 - -

ネイティブのFacebookアプリが電話にインストールされていない場合であることを明確にしたいので、WebViewダイアログが使用されると思います。

4

1 に答える 1

6

Facebook クラスで開かれたセッションを設定した場合、dialog() はユーザーにログインを要求しません。

次に例を示します。

public class MainActivity extends Activity {
    boolean pendingShare;
    Session session;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        if (savedInstanceState != null) {
            pendingShare = savedInstanceState.getBoolean("pendingShare");
            session = Session.restoreSession(this, null, new SessionCallback(), savedInstanceState);
        }

        ((Button) findViewById(R.id.share_button)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onClickShare();
            }
        });
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("pendingShare", pendingShare);
        Session.saveSession(session, outState);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (session != null) {
            session.onActivityResult(this, requestCode, resultCode, data);
        }
    }

    private void onClickShare() {
        pendingShare = true;
        session = new Session(MainActivity.this);
        session.openForRead(new Session.OpenRequest(MainActivity.this).setCallback(new SessionCallback()));
    }

    private void share(Session session) {
        Facebook facebook = new Facebook(session.getApplicationId());
        facebook.setSession(session);
        facebook.dialog(this, "feed", null);
        pendingShare = false;
    }

    class SessionCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (state.isOpened() && pendingShare) {
                share(session);
            }
        }
    }
}

「pendingShare」(およびセッション) の保存/復元は、ログイン中にアクティビティをアンロードできるため、ここで役立ちます。

于 2012-11-02T03:22:50.803 に答える