2

Я использую Facebook входа, как описано в разделе "Начало работы" Документ - https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/Facebook SDK 3 - Session Re-журнал в выпуске

// start Facebook Login 
Session.openActiveSession(this, true, new Session.StatusCallback() { 

    // callback when session changes state 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
    if (session.isOpened()) { 

     // make request to the /me API 
     Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 

     // callback after Graph API response with user object 
     @Override 
     public void onCompleted(GraphUser user, Response response) { 
      if (user != null) { 
      TextView welcome = (TextView) findViewById(R.id.welcome); 
      welcome.setText("Hello " + user.getName() + "!"); 
      } 
     } 
     }); 
    } 
    } 
}); 

при использовании этого кода Facebook распознает пользователя (что loged в в приложении Facebook) и предполагает, что это пользователь, с которым я хочу войти.

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

вещей я пытался до сих пор:

1) выполнить пользователь, авторизуйтесь как это:

SessionTracker sessionTracker = new SessionTracker(activity, new StatusCallback() { 

      @Override 
      public void call(Session session, SessionState state, Exception exception) { 
      } 
     }, null, false); 

     if (sessionTracker.getSession() == null || sessionTracker.getSession().getState().isClosed()) { 
      sessionTracker.setSession(null); 
      Session session = new Session.Builder(activity).setApplicationId(activity.getString(R.string.fb_app_id)).build(); 
      Session.setActiveSession(session); 
     } 

     final Session currentSession = sessionTracker.getSession(); 

     if (!currentSession.isOpened()) { 

      Session.OpenRequest openRequest = null; 
      openRequest = new Session.OpenRequest(activity); 

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

        @Override 
        public void call(Session session, SessionState state, Exception exception) { 

         Request.executeMeRequestAsync(currentSession, new Request.GraphUserCallback() { 

          @Override 
          public void onCompleted(GraphUser user, Response response) { 
           authListener.onCompleteAuthorization(user != null, user, currentSession.getAccessToken(), currentSession.getExpirationDate().getTime()); 
          } 
         }); 

        } 
       }); 
       currentSession.openForPublish(openRequest); 

это работает отлично в первый раз, но второй раз был призван (Скажем, после выхода пользователя из моего приложения и повторного входа в систему с другой учетной записью facebook), он запоминает последнего пользователя, который был зарегистрирован. ! даже после удаления приложения Facebook и моего приложения !!!!

2), призывающую тот же код, прежде чем снова войти в систему:

if (Session.getActiveSession() != null) { 
      Session.getActiveSession().closeAndClearTokenInformation(); 
     } 

он ничего не делает ...

пожалуйста, помогите мне понять, как я могу удалить все предыдущие Facebook История пользователя/закэшированное токенов, чтобы добиться следующего поведения: каждый раз, когда пользователь выполняет вход в Facebook - появится диалоговое окно «Ввести адрес электронной почты + пароль» ...

заранее.

ответ

3

Прежде всего, не используйте SessionTracker напрямую. Это не публичный класс и не предназначен для непосредственного потребления.

Во-вторых, если вы хотите каждый раз открывать диалоговое окно электронной почты/пароля, вам необходимо отключить логин SSO. Вы можете заглянуть внутрь SwitchUserSample для того, как сделать это с несколькими сеансами, но вот суть его:

Session s = new Session(this); 
Session.setActiveSession(s); 
Session.OpenRequest request = new Session.OpenRequest(this); 
request.setPermissions(...); // Note that you cannot set email AND publish_actions in the same request 
request.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); 
request.setCallback(...); 
s.openForRead(request); 

Через некоторое время, в обратном вызове, вы должны проверить при открытии сессии, и если он содержит разрешение publish_actions и если не запрашивать дополнительные разрешения на публикацию (см. пример Scrumptious для примера).

И наконец, когда пользователь выходит из системы, вызовите метод closeAndClearTokenInformation(), как вы это делали ранее. Так как вы сейчас заставляете войти в диалог, он будет работать так, как вы ожидаете.

+0

благодарит за ответ. через 10 наших я проверю. Тогда я буду более рад, если не считать вашего ответа. похоже, что это будет трюк :) –

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