1

私は Facebook SDK (3) を初めて使用し、HelloFacebookSample を正常にコンパイルして実行しました。ウォール投稿のみを公開したいので、不要なものをすべて削除して、投稿ステータス機能のみを使用しようとしました

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

    postStatusUpdateButton = (Button) findViewById(R.id.postStatusUpdateButton);
    postStatusUpdateButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            onClickPostStatusUpdate();
        }
    });
}

private void onClickPostStatusUpdate() {
    performPublish(PendingAction.POST_STATUS_UPDATE);
}

private void performPublish(PendingAction action) {
    Session session = Session.getActiveSession();
    if (session != null) {
        pendingAction = action;
        if (hasPublishPermission()) {
            // We can do the action right away.
            handlePendingAction();
        } else {
            // We need to reauthorize, then complete the action when we get called back.
             Session.ReauthorizeRequest reauthRequest = new Session.ReauthorizeRequest(this, PERMISSIONS).
                        setRequestCode(REAUTHORIZE_ACTIVITY).
                        setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
            session.reauthorizeForPublish(reauthRequest);
        }
    }
}

ただし、performPublish セッションでは null です。

4

1 に答える 1

1

私は自分でこの問題に遭遇しました。ユーザーがログインしていないため、セッションは null です。ユーザーは、reauthorizeRequest を呼び出したり、リクエストを送信したりする前にログインする必要があります。

1 つの方法は、ユーザーが LoginButton をクリックして正常にログインできるようにすることです。ステータス更新を発行しようとしたときにログインしていない場合 (セッションが null)、サインインするように警告する AlertDialog を表示するか、サインイン ダイアログを表示することをお勧めします。

LoginButton は便利な便利なツールですが、残念ながら Facebook では、LoginButton をそのまま使用するか、すべてをゼロから作成するかを選択できます。しかし、Eclipse で LoginButton を開くと、重要なコードが表示されます。

Session currentSession = sessionTracker.getSession();
                if (currentSession == null || currentSession.getState().isClosed()) {
                    sessionTracker.setSession(null);
                    Session session = new Session.Builder(context).setApplicationId(applicationId).build();
                    Session.setActiveSession(session);
                    currentSession = session;
                }
                if (!currentSession.isOpened()) {
                    Session.OpenRequest openRequest = null;
                    if (parentFragment != null) {
                        openRequest = new Session.OpenRequest(parentFragment);
                    } else if (context instanceof Activity) {
                        openRequest = new Session.OpenRequest((Activity)context);
                    }

                    if (openRequest != null) {
                        openRequest.setPermissions(permissions);
                        openRequest.setLoginBehavior(loginBehavior);

                        if (SessionAuthorizationType.PUBLISH.equals(authorizationType)) {
                            currentSession.openForPublish(openRequest);
                        } else {
                            currentSession.openForRead(openRequest);
                        }
                    }
                }

これは、ログインするためのコードです (つまり、ユーザーがログインできるようにログイン画面を表示します)。SessionTracker は自分で使用できますが、Facebook は人々がそれを使用することを意図していない可能性があると思います (SDK ドキュメントには記載されておらず、パッケージは com.facebook.internal であり、開発者が使用することを望んでいないことを意味します)- -ただし、必要に応じてコードを調整できます。

于 2012-12-05T17:54:19.113 に答える