0

Facebook SDK を使用して Open Request を作成しているときに、次のエラーが発生します。

エラー:

原因: java.lang.UnsupportedOperationException: セッション: すでに開いているセッションを開こうとしました。com.facebook.Session.open(Session.java:985) com.facebook.Session.openForRead(Session.java:388) com.photos.pixitor.activities.PhotoEffectBaseActivity.loginRequest(PhotoEffectBaseActivity.java:619)

最初にリクエストを行うと、エラーは発生しません。しかし、最初にログイン リクエストを作成してからリクエストをキャンセルし、再度ログイン リクエストをメインにすると、アプリケーションがクラッシュします。

コードは次のとおりです。

OpenRequest リクエスト = 新しい Session.OpenRequest(this); request.setPermissions(Arrays.asList("basic_info"));

        if(session.isOpened()){

            session.requestNewReadPermissions(new NewPermissionsRequest(
                    PhotoEffectBaseActivity.this,"basic_info"));

            session.addCallback(new StatusCallback() {
                @Override
                public void call(Session session, SessionState state, Exception exception) {
                    if(state.isOpened()){
                        Util.logd("Opened+Publishing Request");
                        publishPhotoRequest(session);
                    }

                    if(session.isOpened()){
                        Util.logd("Session is Opened");
                        getUserDetails(session);
                    }
                }
            });

            return session;
        }

        Util.logd("Session Not Opened: Opening For Read");

        session.openForRead(request);
        Util.logd("Session is Opened for Read");

        session.addCallback(new StatusCallback() {
            @Override
            public void call(Session session, SessionState state, Exception exception) {
                if(state.isOpened()){
                    Util.logd("Opened+Publishing Request");
                    publishPhotoRequest(session);
                }

                if(session.isOpened()){
                    Util.logd("Session is Opened");
                    getUserDetails(session);
                }
            }
        });
4

1 に答える 1

0

認識すべきことの 1 つは、セッションの開始が非同期であることです (Facebook アプリを呼び出して、ユーザー入力を取得する必要がある可能性があるため)。したがって、最初の呼び出しが返されるのを待たずに、2 つの session.open* 呼び出しを続けて行うことはできません。

あなたのコードで起こっていることは、あなたが持っているということです:

if (session.isOpened()) {
  // MAKE AN OPEN REQUEST
}
// MAKE ANOTHER OPEN REQUEST

セッションがすでに開かれている場合、これは基本的に2つのオープンリクエストを連続して行います。

では、これをどのように修正しますか?

まず第一に、session.requestNewReadPermissions()「basic_info」のみを要求するため、この呼び出しは不要です。これはデフォルトで提供されるため、追加の権限を要求する必要はありません。このブロック全体を削除するだけです。

次に、追加の読み取りアクセス許可を要求したい場合は、session.openForRead()後で呼び出すメソッドにそれらを追加するだけです。

最後に、あなたのコードで気付いた他のいくつかの問題: を呼び出した後にコールバックを追加していますがsession.openForRead()、これはおそらく希望どおりに機能しません。requestopenForRead を呼び出す前に、コールバックを に追加する必要があります。写真も公開しようとしていますが、公開許可が要求されていません。

于 2013-11-05T19:03:52.603 に答える