OAuthException при попытке опубликовать на стене друзей

У меня много проблем при попытке опубликовать на стене друзей с помощью API Facebook в Android. Вот что у меня на данный момент:

if (facebook.isSessionValid()) {
                        String response = facebook.request((userID == null) ? "me" : userID);

                        Bundle params = new Bundle();
                        params.putString("message", "put message here");
                        params.putString("link", "http://mylink.com");    
                        params.putString("caption", "{*actor*} just posted this!");
                        params.putString("description", "description of my link.  Click the link to find out more.");
                        params.putString("name", "Name of this link!");
                        params.putString("picture", "http://mysite.com/picture.jpg");

                        response = facebook.request(((userID == null) ? "me" : userID) + "/feed", params, "POST");       

                        Log.d("Tests",response);
                        if (response == null || response.equals("") || 
                                response.equals("false")) {
                            Log.v("Error", "Blank response");
                        }
                    } else {
                        // no logged in, so relogin
                        Log.d("1234567890", "sessionNOTValid, relogin");

                    }
                }catch(Exception e){
                    e.printStackTrace();
                }

Но это возвращается с этой ошибкой:

12-11 21:34:06.604: D/FACEBOOK RESPONSE(14954): {"error":{"message":"(#200) Feed story publishing to other users is disabled for this application","type":"OAuthException","code":200}}

2 ответа

Решение

Вы, вероятно, недавно создали это приложение Facebook, что означает, что в феврале 2013 года включены последние изменения.

Последние изменения февраля включают в себя:

Удаление возможности публиковать в стенах друзей через Graph API

Мы удалим возможность публиковать сообщения на стенах друзей пользователя через Graph API. В частности, сообщения против [user_id]/feed, где [user_id] отличается от пользователя сеанса, или вызовы stream.publish, где user_id пользователя отличается от пользователя сеанса, завершатся ошибкой. Если вы хотите, чтобы люди могли публиковать сообщения на ленте своих друзей, откройте диалоговое окно канала. Истории, которые включают друзей с помощью пометок пользователя или тегов действий, будут отображаться на временной шкале друга (при условии, что друг одобряет тег). Для получения дополнительной информации см. Этот пост в блоге.

Мы отключаем эту функцию, начиная с февраля, если вы хотите включить ее (только временно до февраля), перейдите на панель мониторинга своего приложения> Настройки> Дополнительно> Отключить "Февраль 2013 года, последние изменения"

Однако я настоятельно рекомендую не делать этого, так как начиная с февраля эта функция приведет к тому, что ваше приложение снова выдаст ту же ошибку.

У меня есть решение, которое может вам помочь, я использую это для своего кода, и он работает нормально..

private void publishFeedDialog (String friend_uid) {

    try{
            Session mCurrentSession = Session.getActiveSession();

            SessionTracker mSessionTracker = new SessionTracker(
                    getBaseContext(), new StatusCallback() {
                        public void call(Session session, SessionState state,
                                Exception exception) {
                        }
                    }, null, false);
            String applicationId = Utility
            .getMetadataApplicationId(getBaseContext());
            mCurrentSession = mSessionTracker.getSession();

            if (mCurrentSession == null
                    || mCurrentSession.getState().isClosed()) {
                mSessionTracker.setSession(null);
                Session session = new Session.Builder(getBaseContext())
                .setApplicationId(applicationId).build();
                Session.setActiveSession(session);
                mCurrentSession = session;
            }

            if (!mCurrentSession.isOpened()) {
                Session.OpenRequest openRequest = null;
                openRequest = new Session.OpenRequest(
                        NewFriendList.this);

                if (openRequest != null) {
                    openRequest
                    .setDefaultAudience(SessionDefaultAudience.FRIENDS);
                    openRequest.setPermissions(Arrays.asList("email", "publish_actions"));
                    openRequest
                    .setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);



                    mCurrentSession.openForPublish(openRequest);
                }
            }



            if (regobj != null && friend_uid != null ) {

                final Activity activity = this;
                Bundle params = new Bundle();
                //This is what you need to post to a friend's wall
                params.putString("from", "" + regobj.MyFBID);
                params.putString("to", friend_uid);
                //up to this
                params.putString("name", "Facebook SDK for Android");
                params.putString("caption", "Build great social apps and get more installs.");
                params.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps.");
                params.putString("link", "https://developers.facebook.com/android");
                params.putString("picture", "https://raw.github.com/fbsamples/ios-3.x-howtos/master/Images/iossdk_logo.png");
                WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(this, mCurrentSession, params))
                        .setOnCompleteListener(new OnCompleteListener() {

                        @Override
                        public void onComplete(Bundle values, FacebookException error) {
                            if (error == null) {
                                // When the story is posted, echo the success
                                // and the post Id.
                                final String postId = values.getString("post_id");
                                if (postId != null) {
                                    Toast.makeText(activity,
                                        "Posted story, id: "+postId,
                                        Toast.LENGTH_SHORT).show();
                                } else {
                                    // User clicked the Cancel button
                                    Toast.makeText(activity, 
                                        "Publish cancelled", 
                                        Toast.LENGTH_SHORT).show();
                                }
                            } else if (error instanceof FacebookOperationCanceledException) {
                                // User clicked the "x" button
                                Toast.makeText(activity, 
                                    "Publish cancelled", 
                                    Toast.LENGTH_SHORT).show();
                            } else {
                                // Generic, ex: network error
                                Toast.makeText(activity, 
                                    "Error posting story", 
                                    Toast.LENGTH_SHORT).show();
                            }
                        }



                    }).build();
                feedDialog.show();
            }
    }catch(Exception e)
    {
        Log.d("Error", ""+e.toString());
    }
}

Этот код будет работать только для одного пользователя. Если вы хотите отправить его нескольким пользователям, вы можете использовать RequestsDialogBuilder вместо WebDialog.

Другие вопросы по тегам