1

アプリにログインして、何かを共有できます。これには OPENED セッション状態が必要です。ただし、ログインしていないときに何かを共有したい場合は、セッションを開く必要があります。私はViewPagerを使用しているので、たとえば、あるページから別のページに移動するとき、このコード

Session.openActiveSession(getActivity(), true, new StatusCallback() {
       @Override
       public void call(Session session, SessionState state, Exception exception) {
       }
});

コードの先頭にある場合、セッションがアクティブになり、自動的にログインしますが、これは間違っています! そのため、このコード ブロックを onClickListener に入れ、アプリで共有ボタンをクリックした場合にのみセッションを開きたいと考えています。

if (session != null && session.isOpened()) {
  publishFeedDialog();
}
else {
   Session.openActiveSession(getActivity(), true, new StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
        }
    });
   publishFeedDialog();
}

private void publishFeedDialog() {
  session = Session.getActiveSession();
  Log.i("TAG", session.getState() + ""); //OPENING


  WebDialog feedDialog = (
                    new WebDialog.FeedDialogBuilder(getActivity(),
                        Session.getActiveSession(),
                        params))
                    .setOnCompleteListener(new OnCompleteListener() {

                        @Override
                        public void onComplete(Bundle values,
                            FacebookException error) {
                             if (error == null) {
                                    final String postId = values.getString("post_id");
                                    if (postId != null) {
                                    } else {
                                        // User clicked the Cancel button
                                    }
                                } else if (error instanceof FacebookOperationCanceledException) {
                                } else {
                                    // Generic, ex: network error
                                }
                        }

                    })
                    .build();
                feedDialog.show();
}

エラー:

開いていないセッションを使用しようとしました。

したがって、WebDialog が表示されるはずのときにまだ開いているため、セッションを無駄に開きます。

助けてください。

4

3 に答える 3

5

私にとっては、次のように機能します。

        if (Session.getActiveSession() != null && Session.getActiveSession().isOpened()) {
              publishFeedDialog();
            }
        else {

            Session session = Session.getActiveSession();
            if (!session.isOpened() && !session.isClosed()) {

                //          List<String> permissions = new ArrayList<String>();
                //            permissions.add("email");

                session.openForRead(new Session.OpenRequest(this)
                //                .setPermissions(permissions)
                .setCallback(mFacebookCallback));
            } else {
                Session.openActiveSession(getActivity(), true, mFacebookCallback);
            }
        }`

コールバックの場所

private Session.StatusCallback mFacebookCallback = new Session.StatusCallback() {
    @Override
    public void
    call(final Session session, final SessionState state, final Exception exception) {

        if (state.isOpened()) {
            String facebookToken = session.getAccessToken();
            Log.i("MainActivityFaceBook", facebookToken);
            Request.newMeRequest(session, new Request.GraphUserCallback() {

                @Override
                public void onCompleted(GraphUser user,
                        com.facebook.Response response) {
                    publishFeedDialog();
                }
            }).executeAsync();
            Prefs.setStringProperty(getActivity(), R.string.key_prefs_facebook_token, facebookToken);
        }
    }
};

CallBack onCompleted で publishFeedDialog() を呼び出してみてください

于 2014-04-17T10:57:10.640 に答える
2

セッションのステータスを確認した後、call() 内から publishFeedDialog() を呼び出してみてください (session.isOpened() を使用しないでください。代わりに state.isOpened() を使用してください)。状態をチェックすることで、セッションが開いた状態にあり、リクエストの実行にも使用できることが保証されます。StatusCallback は、セッションが実際に開かれるまで複数回呼び出すことができます。そのため、リクエストを送信する前にステータスを確認する必要があります。

于 2013-09-03T18:32:47.073 に答える
0

フラグメントからセッションを開く場合は、次の openActiveSession メソッドの実装を使用します。

openActiveSession(Context context, Fragment fragment, boolean allowLoginUI, Session.StatusCallback callback)

これは私にとってはうまくいきます。

于 2015-02-15T05:09:09.113 に答える