2014-02-11 3 views
0

В моем приложении сначала запрашиваю первые основные разрешения пользователя и публикую их при необходимости. Сам клиент ничего не делает с помощью accessToken, он просто передает его серверу.Facebook опубликовать разрешение - публикация с сервера

1) После получения базовых разрешений клиент немедленно отправит его на сервер. 2) Проблема начинается, когда клиент запрашивает разрешения на публикацию. Как только пользователь предоставит разрешение на публикацию, мой сеанс по-прежнему показывает старые базовые разрешения. Но если в то же время я проверяю настройки пользователей на fb, это показывает, что приложение предоставило разрешения на публикацию. Но как-то в приложении я не получаю обновленный accessToken.

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

private void requestPublishPermissions(Session session) { 
    if (session != null) { 
     Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, PERMISSION) 
       // demonstrate how to set an audience for the publish permissions, 
       // if none are set, this defaults to FRIENDS 
       .setDefaultAudience(SessionDefaultAudience.FRIENDS) 
       .setRequestCode(REAUTH_ACTIVITY_CODE); 
     session.requestNewPublishPermissions(newPermissionsRequest); 
    } 
} 

когда предоставляется пользователю разрешение (если этот метод называется) рядом Session.StatusCallback после этого вызова метода все еще показывает мне старые сессии разрешения.

Мой вопрос: 1) Как получить обновленный доступТокнуть сразу после публикации разрешений? 2) Если (1) невозможно, то что это правильный способ сделать это? потому что звонок от клиента должен быть с обновленным accessToken. Заставляете пользователя ждать, пока мы не получим обновление accessToken? если да Как?

Спасибо.

+0

Наконец-то я понял это. Я отправлю полное решение, как только я его полностью проверю. – user2095470

ответ

2

Отвечая на мой собственный вопрос

После тратить часы и часы, понял это. Здесь шаг за шагом процесс запрашиваемый читать и публиковать разрешения

Настройки Затмение, Android, Facebook SDK 3.6 Программы MainActivity и статические фрагменты пытаются достичь? Запрашивать разрешения на чтение, а затем публиковать разрешения.

MainActivity

public class YourFragmentActivity extends FragmentActivity { 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //Static Fragment 
    setContentView(R.layout.fragment_layout); 
} 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
} 
} 

YourFragment.java

public class YourFragment extends Fragment { 
public static String TAG = YourFragment.class.getSimpleName(); 

private static final List<String> PERMISSIONS = Arrays.asList("publish_stream, publish_actions"); 

// Flag to represent if we are waiting for extended permissions 

private Session.StatusCallback statusCallback = new SessionStatusCallback(); 
private Session.StatusCallback publishCallback = new PublishCallback(); 

private Button publish; 



@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment, container, false); 

    buttonLoginLogout = (Button) view.findViewById(R.id.buttonLoginLogout); 
    publish = (Button) view.findViewById(R.id.publish); 


      //Make Sure you have session when you instantiate fragment 
    Session session = Session.getActiveSession(); 
    if (session == null) { 
     if (savedInstanceState != null) { 
      session = Session.restoreSession(getActivity(), null, statusCallback, savedInstanceState); 
     } 
     if (session == null) { 
      session = new Session(getActivity()); 
     } 
     Session.setActiveSession(session); 
     if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
      session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
     } 
    } 

    onSessionStateChange(); 

    return view; 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    Session.getActiveSession().addCallback(statusCallback); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    Session.getActiveSession().removeCallback(statusCallback); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Session.getActiveSession().onActivityResult(getActivity(), requestCode, resultCode, data); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    Session session = Session.getActiveSession(); 
    Session.saveSession(session, outState); 
} 

private void onSessionStateChange() { 
    Session session = Session.getActiveSession(); 

    if(session.getPermissions().contains("publish_actions")){ 

       //You got you updated token here with extended permissions 
    } 
    if (session.isOpened()) { 

       //Do you stuff here. e.g Getting accessToken, expiry etc. 

    } 
    else { 
    } 
} 

public void requestPublishPermissions(Activity activity, Session session, List<String> permissions, int requestCode) { 

    if (session != null) { 
     Session.NewPermissionsRequest reauthRequest = new Session.NewPermissionsRequest(activity, permissions).setRequestCode(requestCode); 
     reauthRequest.setCallback(publishCallback); 

     session.requestNewPublishPermissions(reauthRequest); 
    } 
} 

    //Set this on onclick call of some button in you fragment 
private void openForRead() { 
    Session session = Session.getActiveSession(); 
    if (!session.isOpened() && !session.isClosed()) { 
     session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
    } 
    else { 
     Session.openActiveSession(getActivity(), this, true, statusCallback); 
    } 
} 

    //Set this on onclick call of some logout button in you fragment 
private void logMeOut() { 
    Session session = Session.getActiveSession(); 
    if (!session.isClosed()) { 
     session.closeAndClearTokenInformation(); 
    } 
} 

private class SessionStatusCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     onSessionStateChange(); 
     Debug.waitForDebugger(); 
     if (exception != null){ 
          //Handel your exception case here 
      Log.i(TAG, exception.getMessage()); 
        } 
    } 
} 

private class PublishCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     Debug.waitForDebugger(); 
     onSessionStateChange(); 
     if (exception != null){ 
          //Handel your exception case here 
      Log.i(TAG, exception.getMessage()); 
        } 
    } 
} 
} 

Ошибки, которые могут возникнуть

  • 1) опубликовать разрешение не callsback

Это наиболее раздражающим один. Когда пользователь предоставляет разрешение на публикацию разрешения, никогда не возвращается, но тот же раз, если пользователь видит страницу настройки своего приложения в FB, он показывает, что пользователь предоставил разрешение публикации вам. В таком случае технически мы можем использовать тот же accessToken, который мы получили в вызове readForOpen, потому что в большинстве случаев accessToken не изменяется даже после успешных обратных вызовов (это не ошибка). Но мы не можем полагаться на это, так как FB может в любое время изменить accessToken.

Как этого избежать? - Убедитесь, что onActivityResult присутствует как в вашем фрагменте, так и в основной деятельности. И вызов Session.onActivityResult

- Убедитесь, что вы устанавливаете ответ на публикацию newRequest. FB выбирает экземпляр обратного вызова из NewPermissionsRequest с помощью addCallback (newPermissionsRequest.getCallback());

  • 2) Пользователь вошел как другой пользователь Facebook

Интересно, что FB SDK показывает, что это только тогда, когда вы просите опубликовать разрешение. Внутренне FB sdk проверяет fbid, вызывая ответ «me», ответ сравнения (возврат может быть нулевым) с предыдущим (существующим сеансом fbid), и если есть разница между этими двумя SDK, эта ошибка.

Как этого избежать? - Убедитесь, что вы правильно настроили ваше приложение FB, особенно название упаковки. - Это сделало меня сумасшедшим. НЕ ИСПОЛЬЗУЙТЕ ПРОКСИ. при использовании прокси-телефона с Android-телефоном каким-то образом внутренний вызов «ME» FB SDK для проверки ошибок FBID с ошибкой com.facebook.FacebookException: не удалось создать тело запроса, и пользователь графика станет null и, следовательно, эта ошибка. Хотя это странно, потому что я использую скрипач, который является обычным перехватом прокси

Надеюсь, это поможет.

Смежные вопросы