在FB墙上发布使用3.0 SDK

时间:2013-09-09 06:30:26

标签: android facebook session

Hello其他程序员,我在新的Facebook SDK上遇到了困难,

情景是:

我正在使用片段,所以我按照这个步骤

Why doesn't Android Facebook interface work with Fragments?

现在我得到了oncomplete和令牌ID

现在我想张贴在墙上,所以我已经创建了这个功能

private void publishStory(Session session) {

    if (session != null){

        // Check for publish permissions    
        session.addCallback(new StatusCallback() {

            @Override
            public void call(Session session, SessionState state,
                Exception exception) {
                List<String> PERMISSIONS = Arrays
                    .asList("publish_actions");
                session
                    .requestNewPublishPermissions(new Session.NewPermissionsRequest(
                        getActivity(), PERMISSIONS));

                Request request = Request.newStatusUpdateRequest(
                    session, "Temple Hello Word Sample",
                    new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            Log.i("fb:done = ", response.getGraphObject() + ","
                                + response.getError());
                        }
                    });
                request.executeAsync();

            }

        });

并将声明放在不完整

    public void call(final Session session, SessionState state, Exception exception) {
            if (session.isOpened()) {
                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                    @Override
                    public void onCompleted(GraphUser user, Response response) {



                                                        publishStory(session);
                        }
                        else
                        {
                            Log.v("FACEBOOK ", "NO ACCESS");
                        }
                    }
                });
            }

我的问题出现在这行代码session.addCallback(new StatusCallback() {上,它跳过了下一步,从而结束了这个功能而没有张贴在我的墙上。

我非常确定会话是活动的,因为我有applicationID和访问令牌..

任何帮助?

谢谢

修改

我使用此代码基于以下答案并添加了新权限

private void publishStoryTEST(final Session session)
{       

    if (session != null) 
    {
        Bundle postParams = new Bundle();
        postParams.putString("message", "TEST");
        Request.Callback callback = new Request.Callback() 
        {


            public void onCompleted(Response response) 
            {


                JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
                String postId = null;
                try 
                {
                    postId = graphResponse.getString("id");

                } 
                catch (JSONException e) 
                {
                    Log.i("JSON", "JSON error " + e.getMessage());
                }
                FacebookRequestError error = response.getError();
                Log.e("post response", response.toString());
                if (error != null) 
                {
                } 
                else 
                {
                }

            }
        };
        List<String> PERMISSIONS = Arrays
                .asList("publish_actions");
        session.requestNewPublishPermissions(new Session.NewPermissionsRequest(getActivity(), PERMISSIONS));    
        Request request = new Request(session, "me/feed", postParams, HttpMethod.POST, callback);

        RequestAsyncTask task = new RequestAsyncTask(request);
        task.execute();

    }
}

但我仍然收到错误说

The user hasn't authorized the application to perform this action

为什么我仍然会收到错误?许可从未打过电话吗?

3 个答案:

答案 0 :(得分:1)

问题很常见,我正在与您分享我目前在我的应用程序中使用的发布方法的工作源代码。

private void publishStory(String status)
{       
Session session = Session.getActiveSession();

if (session != null) 
{
Bundle postParams = new Bundle();
postParams.putString("message", status);
Request.Callback callback = new Request.Callback() 
    {
    public void onMalformedURLException(MalformedURLException e)
          {

          } 
    public void onIOException(IOException e) 
          {

          } 
    public void onFileNotFoundException(FileNotFoundExceptione) 
          {

          } 
    public void onFacebookError(FacebookError e) 
          {

          }

public void onCompleted(Response response) 
{
    JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
    String postId = null;
    try 
    {
        postId = graphResponse.getString("id");
    } 
    catch (JSONException e) 
    {
        Log.i("JSON", "JSON error " + e.getMessage());
    }
    FacebookRequestError error = response.getError();
    Log.e("post response", response.toString());
    if (error != null) 
    {
    } 
    else 
    {
    }
}
};

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


我希望这能解决你的问题。

修改:
有关使用适当权限和发布功能设置Facebook SDK 3.0的详细步骤,请参阅以下链接 Post to facebook after login fails Android
http://www.kpbird.com/2013/03/android-login-using-facebook-sdk-30.html

答案 1 :(得分:1)

//尝试以下代码

private void postData() {
        lnrPbr.setVisibility(View.VISIBLE);
        isSharingData = true;

        Session session = Session.getActiveSession();
        if (session != null) {

            Bundle postParams = new Bundle();
            postParams.putString("name", getIntent().getStringExtra("IN_SHARE_CAPTION") == null ? "" : getIntent().getStringExtra("IN_SHARE_CAPTION"));
            postParams.putString("caption", getIntent().getStringExtra("IN_SHARE_CAPTION") == null ? "" : getIntent().getStringExtra("IN_SHARE_CAPTION"));
            postParams.putString("description", getIntent().getStringExtra("IN_SHARE_DESCRIPTION") == null ? "" : getIntent().getStringExtra("IN_SHARE_DESCRIPTION"));
            postParams.putString("link", getIntent().getStringExtra("IN_SHARE_SHARELINK") == null ? "" : getIntent().getStringExtra("IN_SHARE_SHARELINK"));
            postParams.putString("picture", getIntent().getStringExtra("IN_SHARE_THUMB") == null ? "" : getIntent().getStringExtra("IN_SHARE_THUMB"));
            postParams.putString("message", getIntent().getStringExtra("IN_SHARE_MESSAGE") == null ? "" : getIntent().getStringExtra("IN_SHARE_MESSAGE"));

            Request.Callback callback = new Request.Callback() {

                public void onCompleted(Response response) {
                    isSharingData = false;
                    lnrPbr.setVisibility(View.GONE);
                    FacebookRequestError error = response.getError();
                    if (error != null) {
                        IjoomerUtilities.getCustomOkDialog(getString(R.string.facebook_share_title), error.getErrorMessage(), getString(R.string.ok), R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {

                            @Override
                            public void NeutralMethod() {
                                finish();
                            }
                        });
                    } else {
                        IjoomerUtilities.getCustomOkDialog(getString(R.string.facebook_share_title), getString(R.string.facebook_share_success), getString(R.string.ok), R.layout.ijoomer_ok_dialog, new CustomAlertNeutral() {

                            @Override
                            public void NeutralMethod() {
                                finish();
                            }
                        });
                    }
                }
            };

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

            RequestAsyncTask task = new RequestAsyncTask(request);
            task.execute();
        }

    }

答案 2 :(得分:0)

参考本教程..

http://www.androidhive.info/2012/03/android-facebook-connect-tutorial/

public void postToWall() {
    // post on user's wall.
    facebook.dialog(this, "feed", new DialogListener() {

        @Override
        public void onFacebookError(FacebookError e) {
        }

        @Override
        public void onError(DialogError e) {
        }

        @Override
        public void onComplete(Bundle values) {
        }

        @Override
        public void onCancel() {
        }
    });

}