0

Android で Facebook SDK を使用しています。Facebook SDK を Activity または Fragment に常駐させずに Facebook を使用するアプリを作成しようとしています。つまり、クリックした後に画像を共有できるようにするボタンがあります。

Facebook SDKを開いて許可を求めましたが、Session.OPENINGでスタックしているため、許可を要求できず、公開できません。

私のコードは次のとおりです(情報を追加しないため、変数とヘルパー関数は投稿しませんでした)。アクティビティ内ではなく、クラス内にありました。

この時点で、PostToFacebook を 1 回呼び出して (セッションを開こうとします)、もう一度呼び出して、投稿を試みます。この重複は後で修正します。

public void postToFacebook(byte[] ImageToPost, Activity activity, Bundle savedInstanceState) {

    Session session = Session.getActiveSession();

    if (session != null){
        SessionState state = session.getState();
        Log.d("facebook","in PostToFacebook. session: " + state.name());

        if (!state.isOpened()) {
            Log.d("facebook","Session is not open - aborting publish");
            return;
        }

        // Check for publish permissions    
        List<String> permissions = session.getPermissions();
        if (!isSubsetOf(PERMISSIONS, permissions)) {
            pendingPublishReauthorization = true;
            Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity, PERMISSIONS);
            session.requestNewPublishPermissions(newPermissionsRequest);
            return;
        }

        Bundle postParams = new Bundle();
        postParams.putString("name", "Name of post");
        postParams.putString("caption", "Caption of post [testing]");
        postParams.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps.");
        postParams.putString("link", "some link");
        postParams.putString("picture", "https://raw.github.com/fbsamples/ios-3.x-howtos/master/Images/iossdk_logo.png");

        Request.Callback callback= new Request.Callback() {
            public void onCompleted(Response response) {
                Log.d("facebook","Callback after onCompleted");

                JSONObject graphResponse = response
                                           .getGraphObject()
                                           .getInnerJSONObject();
                String postId = null;
                try {
                    postId = graphResponse.getString("id");
                } catch (JSONException e) {
                    Log.i(TAG,
                        "JSON error "+ e.getMessage());
                }
                FacebookRequestError error = response.getError();
                if (error != null) {
                    Toast.makeText(MainMirrorActivity.context
                         .getApplicationContext(),
                         error.getErrorMessage(),
                         Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainMirrorActivity.context
                             .getApplicationContext(), 
                             postId,
                             Toast.LENGTH_LONG).show();
                }
            }
        };

        Request request = new Request(session, "me/feed", postParams, 
                              HttpMethod.POST, callback);

        RequestAsyncTask task = new RequestAsyncTask(request);
        task.execute();
    } else { 
        // open new session
        Log.d("facebook","opening a new session");
        if (savedInstanceState != null) {
            session = Session.restoreSession(activity, null, statusCallback, savedInstanceState);
        }
        if (session == null) {
            session = new Session(activity);
        }
        Session.setActiveSession(session);
        //SessionState state = session.getState();
        if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
            Log.d("facebook","openForRead");
            session.openForRead(new Session.OpenRequest(activity).setCallback(statusCallback));
        }

        if (!session.isOpened() && !session.isClosed()) {
            Log.d("facebook","openForRead if session not open and not closed");
            session.openForRead(new Session.OpenRequest(activity).setCallback(statusCallback));
        } else {
            Log.d("facebook","openActiveSession");
            Session.openActiveSession(activity, true, statusCallback);
        }
    }
}

ステータスを確認すると、常に OPENING のままです。

どうもありがとう!

PS - コードはほとんど動作しているように見えるので、とにかく誰かを助けるかもしれません.

4

1 に答える 1

0

あなたが投稿したコードは、セッション オブジェクトが初期化される最初のポイントであると想定しています。getActiveSession == null の場合、最初にelseブロックで試します

Session session = Session.openActiveSessionFromCache(getApplicationContext());

それ以外の

session = new Session(activity);

セッションを受けるための呼び出しとして。しかし、それはあなたの主な問題ではないと思います。

コールバックをセッションにアタッチして、ステートのオープンが完了したらアクションを実行できるようにします。

あなたのnullチェックの後、セッションがまだ準備ができていない可能性を想定し、準備ができたときのコールバックを添付します

    if(session.isOpened()){
            doSomething(session);
        } else {
            session.addCallback(new Session.StatusCallback() {
                @Override
                public void call(Session session, SessionState state, Exception exception) {
                    if(session.isOpened()){
                        doSomething(session);
                    }

                }
            });
        }
于 2013-05-29T11:29:07.530 に答える