1

FB チュートリアルを順を追って実行しましたが、なぜこれが機能しないのかわかりません。

すべてのフラグメントはBaseFragmentから継承します:

public class BaseFragment extends SherlockFragment {
    ...
    protected UiLifecycleHelper _uiHelper;
    protected boolean _isResumed = false;

    protected static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
    protected static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
    protected boolean _pendingPublishReauthorization = false;


    protected Session.StatusCallback _callback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        _uiHelper = new UiLifecycleHelper(getSherlockActivity(), _callback);
        _uiHelper.onCreate(savedInstanceState);
    }

    protected void onSessionStateChange(Session session, SessionState state, Exception exception) {}

    ...(all lifecycle stuff)
}

次に、ログイン/ログアウトボタンを含むFacebookLoginFragmentがあります。

public class FacebookLoginFragment extends BaseFragment {

    protected LoginButton _authButton;
    protected ProgressBar _loadingBar;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.facebook_login, container, false);

        _loadingBar = (ProgressBar) view.findViewById(R.id.login_progressBar);

        _authButton = (LoginButton) view.findViewById(R.id.authFacebookButton);
        _authButton.setFragment(this);
        _authButton.setReadPermissions(Arrays.asList("email", "user_birthday"));

        return view;
    }

    @Override
    protected void onSessionStateChange(Session session, SessionState state, Exception exception) {
        super.onSessionStateChange(session, state, exception);

        // LogIn process
    }
    ...
}

最後に、フィードのlistViewを含む NewsFragment があります。各フィードは共有可能です。フィードの共有ボタンをクリックすると、アダプターはNewsFragment.publishFeed(feed)メソッドを呼び出します。

public class NewsFragment extends BaseFragment{
    ...
    protected Feed _feedPendingPublish;

    @Override
    // => NEVER CALLED 
    protected void onSessionStateChange(Session session, SessionState state, Exception exception) {
        super.onSessionStateChange(session, state, exception);

        if (_isResumed) {

            if (_pendingPublishReauthorization && state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
                _pendingPublishReauthorization = false;
                if(_feedPendingPublish != null){
                    publishFeed(_feedPendingPublish);
                    _feedPendingPublish = null;
                }
            }
        }
    }

    public void publishFeed(Feed feed){

        if(_pendingPublishReauthorization){
            return;
        }

        Session session = Session.getActiveSession();

        if (session != null){

            // If permission doesn't exist, ask and return. Otherwise, send request

            List<String> permissions = session.getPermissions();
            if (!isSubsetOf(PERMISSIONS, permissions)) {
                _pendingPublishReauthorization = true;
                _feedPendingPublish = feed;

                Session.NewPermissionsRequest newPermissionsRequest = new Session
                    .NewPermissionsRequest(getSherlockActivity(), PERMISSIONS);
                session.requestNewPublishPermissions(newPermissionsRequest);

                return;
            }

            // DO stuff
        }
    }
}

問題は、公開承認後に NewsFragment コールバックが呼び出されないことです。(BaseFragment でも FacebookLogin でもありません)。両方のフラグメントが同じアクティビティに存在することに注意してください。

私はfacebook-android-sdk-3.5.2を使用しています

4

3 に答える 3

3

私はついにこれを理解しました。多くの人が言ったように、それはonActivityResult()問題でしたが、かなり悪質でした。

ログインすると、FacebookLoginFragment.onSessionStateChange()は正常にNewsFragment.onSessionStateChange()呼び出されましたが、許可プロセス中に は呼び出されませんでした。

いくつかのテストの後、これは静的および動的バインディングが原因であると思います。MyFacebookLoginfragmentは xml (静的) で直接参照されますが、My NewsFragment はソース コードに動的に追加されます。その結果、両方のフラグメントを含むアクティビティは、 にonActivityResultシグナルを送信するだけでしたFacebokLoginFragment。したがって、NewsFragment.onActivityResult()コールバックをトリガーするために必要な が呼び出されませんでした。

をオーバーライドするActivity.onActivityResult()と、期待される動作が得られます。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    getSupportFragmentManager().findFragmentById(R.id.my_fragment_frame).onActivityResult(requestCode, resultCode, data);
} 
于 2013-10-15T13:19:46.773 に答える
1

はい、確かに、コールバックと新しいパーミッション リクエストに関するバグがまだ残っているようです。

一時的な回避策として、次を呼び出すことができます。

session.addCallback(yourCallback);

session.requestNewPublishPermissions を呼び出す直前。

このコールバックは、セッションの将来のすべての状態変更を受け取ることに注意してください。それが望ましくない場合は、公開後にいつでも session.removeCallback(yourCallback) を呼び出すことができます。

于 2013-10-14T21:55:34.573 に答える
0

Ming さんの言うようにコールバックを追加しても、問題が発生する可能性があります。

このバグを参照してください: https://developers.facebook.com/bugs/130681460449340

コメントに提案された解決策/回避策があるようです。

于 2013-10-14T20:18:02.670 に答える