2013-09-13 5 views
2

У меня есть приведенный ниже код для входа в Facebook и получения электронной почты пользователей, это отлично работает, когда у пользователя нет собственного приложения, оно открывает всплывающее окно и позволяет пользователь вводит свою информацию в facebook. Но когда у них есть собственное приложение, он запрашивает разрешения, и ничего больше не делает. Кажется, у меня есть один и тот же вопрос, как How to disable facebook native app for user login, а также Android Facebook authorization - can not log in when official Facebook app is installedDIsable родное приложение для входа в facebook (просто используйте всплывающее окно)

Однако мой код совсем немного отличается, поэтому я надеюсь, кто-то может помочь мне заставить мой код, чтобы использовать только всплывающее окно.

Моего код

public class FbLoginActivity extends Activity { 

    private static List<String> permissions; 
    Session.StatusCallback statusCallback = new SessionStatusCallback(); 
    ProgressDialog dialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fblogin); 
     Button fbButton = (Button) findViewById(R.id.fbshare); 
     /***** FB Permissions *****/ 
     permissions = new ArrayList<String>(); 
     permissions.add("email"); 
     /***** End FB Permissions *****/ 
     fbButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Check if there is any Active Session, otherwise Open New 
       // Session 
       Session session = Session.getActiveSession(); 
       if (session == null) { 
        Session.openActiveSession(FbLoginActivity.this, true, 
          statusCallback); 
       } else if (!session.isOpened()) { 
        session.openForRead(new Session.OpenRequest(
          FbLoginActivity.this).setCallback(statusCallback) 
          .setPermissions(permissions)); 
       } 
      } 
     }); 
     Session session = Session.getActiveSession(); 
     if (session == null) { 
      if (savedInstanceState != null) { 
       session = Session.restoreSession(this, null, statusCallback, 
         savedInstanceState); 
      } 
      if (session == null) { 
       session = new Session(this); 
      } 
      Session.setActiveSession(session); 
      session.addCallback(statusCallback); 
      if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
       session.openForRead(new Session.OpenRequest(this).setCallback(
         statusCallback).setPermissions(permissions)); 
      } 
     } 
    } 

    private class SessionStatusCallback implements Session.StatusCallback { 

     @Override 
     public void call(Session session, SessionState state, 
       Exception exception) { 
      // Check if Session is Opened or not 
      processSessionStatus(session, state, exception); 
     } 
    } 

    public void processSessionStatus(Session session, SessionState state, 
      Exception exception) { 
     if (session != null && session.isOpened()) { 
      if (session.getPermissions().contains("email")) { 
       // Show Progress Dialog 
       dialog = new ProgressDialog(FbLoginActivity.this); 
       dialog.setMessage("Logging in.."); 
       dialog.show(); 
       Request.executeMeRequestAsync(session, 
         new Request.GraphUserCallback() { 

          @Override 
          public void onCompleted(GraphUser user, 
            Response response) { 

           if (dialog != null && dialog.isShowing()) { 
            dialog.dismiss(); 
           } 
           if (user != null) { 
            Map<String, Object> responseMap = new HashMap<String, Object>(); 
            GraphObject graphObject = response 
              .getGraphObject(); 
            responseMap = graphObject.asMap(); 
            Log.i("FbLogin", "Response Map KeySet - " 
              + responseMap.keySet()); 
            // TODO : Get Email 
            // responseMap.get("email"); 
            String fb_id = user.getId(); 
            String email = null; 
            String name = (String) responseMap 
              .get("name"); 
            if (responseMap.get("email") != null) { 
             email = responseMap.get("email") 
               .toString(); 
             Intent i = new Intent(FbLoginActivity.this, FbLogin2Activity.class); 
             i.putExtra("Email", email); 
             startActivity(i); 
            } else { 
             // Clear all session info & ask user to 
             // login again 
             Session session = Session 
               .getActiveSession(); 
             if (session != null) { 
              session.closeAndClearTokenInformation(); 
             } 
            } 
           } 
          } 
         }); 
      } else { 
       session.requestNewReadPermissions(new Session.NewPermissionsRequest(
         FbLoginActivity.this, permissions)); 
      } 
     } 
    } 

    /********** Activity Methods **********/ 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Log.d("FbLogin", "Result Code is - " + resultCode + ""); 
     Session.getActiveSession().onActivityResult(FbLoginActivity.this, 
       requestCode, resultCode, data); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     // TODO Save current session 
     super.onSaveInstanceState(outState); 
     Session session = Session.getActiveSession(); 
     Session.saveSession(session, outState); 
    } 

    @Override 
    protected void onStart() { 
     // TODO Add status callback 
     super.onStart(); 
     Session.getActiveSession().addCallback(statusCallback); 
    } 

    @Override 
    protected void onStop() { 
     // TODO Remove callback 
     super.onStop(); 
     Session.getActiveSession().removeCallback(statusCallback); 
    } 

UPDATE Так что я не обладаю активностью установить в настройках Дева Facebook, что имеет смысл, так что я должен положить как деятельность, так что FbLoginActivity processSessionStatus получает (так что я могу получить адрес электронной почты и передать его)

ответ

0

Вы разместили в своих Facebook App настройках на Facebook.com название деятельности, в которой приложение facebook предназначено для перехода к однократной аутентификации компл eted?

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

+0

Он не должен иметь назвать что-нибудь, конечно? как приведенный выше код должен просто получить электронную почту с сеанса и запустить следующее мероприятие –

+0

Является ли приложение вернувшимся правильно в веб-регистрации, но не корректно возвращается из родного приложения? Тогда это потенциальная проблема с настройками вашего приложения Facebook. Для этого требуется полный пакет и имя класса для действия, которое должно быть возвращено. –

+0

Да, приложение отлично работает с появлением веб-знака, а собственное приложение ничего не делает. У меня нет класса активности в настройках facebook dev, поэтому я думаю, что это проблема, но вопрос в том, как заставить его вернуться к одной и той же активности и запустить processSessionStatus –

1

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

+0

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

+0

Является ли приложение вернувшимся правильно в веб-регистрации, но не корректно возвращается из собственного приложения? Тогда это потенциальная проблема с настройками вашего приложения Facebook. Для этого требуется полный пакет и имя класса для действия, которое должно быть возвращено. –

0
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    facebook.authorizeCallback(requestCode, resultCode, data); 
} 

Используйте этот код при активации имявообразятеля для входа в систему.

0

ответ: добавить эту строку в арчи

session.openForRead(new Session.OpenRequest(
         FbLoginActivity.this).setCallback(statusCallback) 
         .setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);// add this line for open only dialog or pop-up 
         .setPermissions(permissions)); 

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

  • Нет связанных вопросов^_^