0

我在 Android 中使用 Facebook SDK。我正在尝试创建一个使用 facebook 的应用程序,而无需 facebook SDK 驻留在某些 Activity 或 Fragment 中。即-我有一个按钮,单击它后,我想允许共享一些图像。

我得到它来打开 facebook SDK,请求许可,但它卡在 Session.OPENING 上,然后我无法请求许可 - 因此无法发布。

我的代码如下(我没有发布变量和辅助函数,因为它们没有添加信息)。它驻留在一个类中,而不是在一个活动中。

此时我将调用 PostToFacebook 一次(它会尝试打开会话)然后我会再次调用它 - 所以它会尝试发布。我稍后会修复这个副本。

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);

作为您获得会议的电话。但我不认为这是你的主要问题。

将回调附加到会话,以便您可以在状态完成打开后执行操作。

在你的空检查之后,我会假设会话尚未准备好,并在它准备好时附加一个回调

    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 回答