Ссылка на публикацию в Facebook на стене друзей проблематична

Я пытаюсь опубликовать сообщение на стене друзей, используя следующий код, который я взял из одного из их руководств. Я реализовал все методы жизненного цикла, но не ясно, что происходит.

Сценарий:

У меня есть активность и фрагмент, привязанный к входу в facebook -> я запрашиваю разрешения на чтение в этой настройке и заполняю свою БД соответствующей информацией, которую я получаю от Facebook.

Теперь у меня есть настройка вкладки, которая имеет разные фрагменты MainActivity и дочерние, два из этих дочерних элементов содержат списки, каждая строка этого списка связана с разными идентификаторами друзей Facebook. При нажатии кнопки facebook_post в этом списке я использую следующую функцию для публикации на стене друзей facebook:

if (isNetworkConnected()) {
    Session session = Session.getActiveSession();
    if (session != null) {
        if(isLoggedIn()){
            Toast.makeText(getActivity(),"Session not null and logged in", Toast.LENGTH_LONG).show();
            if (hasPublishPermission()) {
                System.out.println("Has publish");
                Toast.makeText(getActivity(),"Session not null and logged in and publish too", Toast.LENGTH_LONG).show();
                Bundle params = new Bundle();
                params.putString("name", "Digital");
                params.putString("link", "http://www.digitals.com/");
                params.putString("picture","http://www.exar.com/images/frontend/logo.png");
                params.putString("to", FACEBOOK_ID);
                params.putString("caption", "Congrulations!");
                params.putString("description", textGreeting);
                params.putString("message", "message");


                WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(
                        getActivity(), Session.openActiveSessionFromCache(getActivity()),
                        params)).setOnCompleteListener(
                                new OnCompleteListener() {

                                    @Override
                                    public void onComplete(Bundle values,
                                            FacebookException error) {
                                        // frag3.setFbId(null);
                                        // ---------------------------- got to put
                                        // check here
                                        //  onBackPressed();

                                    }
                                }).build();
                feedDialog.show();
            } else if (session.isOpened()) {
                // We need to get new permissions, then complete the action
                if (!hasPublishPermission())
                    session.requestNewPublishPermissions(new Session.NewPermissionsRequest(getActivity(), PERMISSION));
                Bundle params = new Bundle();
                params.putString("name", "Digital");
                params.putString("link", "http://www.digitals.com/");
                params.putString("picture","http://www.exareceipts.com/images/frontend/logo.png");
                params.putString("to", FACEBOOK_ID);
                params.putString("caption", "Congrulations!");
                params.putString("description", textGreeting);
                params.putString("message", "message");

                WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(
                        getActivity(), Session.getActiveSession(),
                        params)).setOnCompleteListener(
                                new OnCompleteListener() {

                                    @Override
                                    public void onComplete(Bundle values,FacebookException error) {
                                        // frag3.setFbId(null);
                                        // ---------------------------- got to put
                                        // check here
                                        //onBackPressed();

                                    }
                                }).build();
                feedDialog.show();
            }
        }else{
            Toast.makeText(getActivity(),"Please check if you are logged in", Toast.LENGTH_LONG).show();

            mainFrag.setParam(1); 

            Intent mainIntent;
            mainIntent = new Intent(getActivity(),FacebookMain.class); 
            getActivity().startActivity(mainIntent);
        }
    }
} else {
    Toast.makeText(getActivity(),"Please check your internet connection", Toast.LENGTH_LONG).show();
}

}catch (Exception e){
    System.out.println("Exception post fb: " +e);
    Toast.makeText(getActivity(), "first construct"+e, Toast.LENGTH_SHORT).show();
}

это моя функция isLoggedIn:

public boolean isLoggedIn() {
        Session session = Session.getActiveSession();
        if (session != null && session.isOpened()) {
            return true;
        } else {
            return false;
        }
    }

Это мои методы LifeCycle (в текущем фрагменте):

private final String PENDING_ACTION_BUNDLE_KEY = "com.exa.dig:PendingAction";


    private PendingAction pendingAction = PendingAction.NONE;
    private GraphUser user1;

    private enum PendingAction {
        NONE, POST_PHOTO, POST_STATUS_UPDATE
    }



    private Session.StatusCallback callback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    }; 

    public static boolean isActive() {
        Session session = Session.getActiveSession();
        if (session == null) {
            return false;
        }
        return session.isOpened();
    } 



@Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        uiHelper = new UiLifecycleHelper(getActivity(), callback);
        uiHelper.onCreate(savedInstanceState);
    }




private void onSessionStateChange(Session session, SessionState state,
            Exception exception) {
        if (pendingAction != PendingAction.NONE && (exception instanceof FacebookOperationCanceledException || exception instanceof FacebookAuthorizationException)) {
            new AlertDialog.Builder(getActivity()) .setTitle("cancelled").setMessage("NotGranted").setPositiveButton("Ok", null).show();
            pendingAction = PendingAction.NONE;
        } else if (state == SessionState.OPENED_TOKEN_UPDATED) {
            handlePendingAction();
        }
        updateUI();
    }





    public boolean isLoggedIn() {
        Session session = Session.getActiveSession();
        if (session != null && session.isOpened()) {
            return true;
        } else {
            return false;
        }
    }


    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }



    private void updateUI() {
        Session session = Session.getActiveSession();
        boolean enableButtons = (session != null && session.isOpened());



        if (enableButtons && user1 != null) {
            //  profilePictureView.setProfileId(user.getId());
            //  greeting.setText(getString(R.string.app_name, user.getFirstName()));
        } else {
            //  profilePictureView.setProfileId(null);
            //  greeting.setText(null);
        }
    }

    @SuppressWarnings("incomplete-switch")
    private void handlePendingAction() {
        PendingAction previouslyPendingAction = pendingAction;
        // These actions may re-set pendingAction if they are still pending, but
        // we assume they
        // will succeed.
        pendingAction = PendingAction.NONE;

    } 


    private boolean hasPublishPermission() {
        Session session = Session.getActiveSession();
        return session != null && session.getPermissions().contains("publish_actions");
    }

в onCreate:

uiHelper = new UiLifecycleHelper(getActivity(), callback);
    uiHelper.onCreate(savedInstanceState);


//===============================================

Session.openActiveSessionFromCache(getActivity());

//================================================

Однако я получаю исключение:

java.lang.UnsupportedOperationException: Session: an attempt was made to request new permissions for a session that has a pending request

Вышеупомянутое обычно происходит, когда я удаляю приложение FB со своего телефона, чтобы проверить, работает ли веб-диалог. Есть идеи?


person Skynet    schedule 26.05.2014    source источник
comment
вы видели это stackoverflow.com/a/14817630/1665507?   -  person Spring Breaker    schedule 26.05.2014
comment
Да, я проверил это, однако я следую шаблону UiLifeCycleHelper, хотя он недостаточно ясен для меня! Мне нужен скелет активности, который можно использовать для публикации на стене друзей.   -  person Skynet    schedule 26.05.2014


Ответы (1)


Ошибка обычно означает, что вы отправляете запрос на разрешение, в то время как выполняется другой запрос. Не видя всего потока вашего кода, невозможно сказать, где это происходит.

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

person Ming Li    schedule 27.05.2014
comment
Здравствуйте, Минг Ли, можете ли вы привести пример простого действия, скажем, скелет, на который я могу ссылаться, или ссылку? - person Skynet; 28.05.2014
comment
Минли Ты спас мою задницу! - person Skynet; 02.03.2015