0

この Android アプリの操作の流れは次のとおりです。

  1. UserX は facebook に登録します
  2. UserX は read_permissions を付与します
  3. UserX は publish_permissions を付与します
  4. 彼の access_token はデータベースに保存されます。
  5. UserX ログアウト

  6. UserY レジスター ... [同じ手順に従います]

複数のユーザーのログインが必要なので、SUPPRESS_SSO が必要です ( How to disable Single SIGN On for facebook android app? に感謝します)。

Facebook API 3.0 では、Facebook は ReadPermissions と PublishPermissions を異なるものにしました。両方のアクセス許可の要求に成功しましたが、ユーザーは 2 回ログインする必要があります (SSO が抑制され、Web ビューが表示されるため) - ログイン Web ビューがもう一度ポップアップします - ユーザーは自分の電子メールとパスワードを入力する必要があります。ユーザーがパスワードを再入力しなくても、PublishPermissions または ReadPermissions に (任意の順序で) アクセスしたいと考えています。

Java コードの関連する関数を次に示します。

private static final List<String> PERMISSIONS = Arrays.asList("user_photos", "read_friendlists", "email", "publish_actions", "publish_stream");


private void updateView() {
    Session session = Session.getActiveSession();
    if (session.isOpened()) {
        handleAnnounce();
        textInstructionsOrLink.setText(ACKNOWLEDGE_USER);
        buttonLoginLogout.setText(R.string.logout);
        buttonLoginLogout.setOnClickListener(new OnClickListener() {
            public void onClick(View view) { 
               onClickLogout(); 
            }
        });
    } else {
        textInstructionsOrLink.setText(R.string.login);
        buttonLoginLogout.setText(R.string.login);
        buttonLoginLogout.setOnClickListener(new OnClickListener() {
            public void onClick(View view) { 
                onClickLogin();
            }
        });
    }
}

private void onClickLogin() {
    Session session = Session.getActiveSession();
    if (!session.isOpened() && !session.isClosed()) {
        Session.OpenRequest openRequest = new Session.OpenRequest(this).setCallback(statusCallback);
        List<String> readPermissions = Arrays.asList("user_photos", "email", "read_friendlists");
        openRequest.setPermissions(readPermissions);
        openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        session.openForRead(openRequest);
    } else {
        Session.openActiveSession(this, true, statusCallback);
    }
}


private void requestPublishPermissions(Session session) {
    Log.d(LOG_TAG, "Requesting Publish Permissions...");
    if (session != null) {
        List<String> publishPermissions = Arrays.asList("publish_actions", "publish_stream");
        final int REAUTH_ACTIVITY_CODE = 100;
        Session.NewPermissionsRequest reauthRequest = new Session.NewPermissionsRequest(this, publishPermissions).setRequestCode(REAUTH_ACTIVITY_CODE);
        reauthRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        session.requestNewPublishPermissions(reauthRequest);
    }
}

private void handleAnnounce() {
    Session session = Session.getActiveSession();
    if (session == null || !session.isOpened()) {
        return;
    }

    List<String> permissions = session.getPermissions();
    if (!permissions.containsAll(PERMISSIONS)) {
        requestPublishPermissions(session);
        return;
    }
}
4

1 に答える 1

2

あなたのコードは問題ないようです。これは最近報告された API のバグです:

https://developers.facebook.com/bugs/268146283318403?browse=search_51235ada57ba59615000124

しばらくお待ちください。まったく同じエラーが発生しました。私たちにできることは、修正された API を待つことだけです。

于 2013-02-21T11:49:49.033 に答える