2013-05-23 1 views
1

Android 애플리케이션에 Facebook SDK가 구현되었습니다. SDK의 로그인 기능을 사용하고 있습니다. 내가 뭘하려고 않습니다 : MainActivity가 시작되면 활성 세션 메서드가 여러 번 호출되었지만 한 번만 호출되었습니다.

  • 가있는 경우

    • 는 확인이없는 경우, 사용자에게 페이스 북에 로그인 할 수있는 기회를 제공
    • 하는 경우가 사용자가 다른 활동으로 리디렉션되어야합니다 (HomeActivity라고 부름).

    내 응용 프로그램이 시작되면 MainActivity가 시작됩니다. 내 onCreate() 방법은 다음과 같습니다

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        requestWindowFeature(Window.FEATURE_NO_TITLE); 
        this.app = (ApplicationClass)getApplicationContext(); 
    
        app.setUiHelper(new UiLifecycleHelper(this, callback)); 
    
        uiHelper = app.getUiHelper(); 
        uiHelper.onCreate(savedInstanceState); 
        if(this.app.getLoggedIn()) { 
    
         setContentView(R.layout.login); 
        startLoggingIn(); // <-- Makes login button invisible and starts spinner 
         login(); 
    
    
        } else { 
    
         setContentView(R.layout.login); 
    
        } 
    } 
    

    ApplicationClass 내가 응용 프로그램 라이프 사이클 전반에 걸쳐 사용할 수있는 정보의 모든 종류를 설정하는 클래스이다. 별로 중요하지는 않지만 예제에 포함 시켰다고 생각합니다. MainActivity가 시작될 때

    그래서, 그것은 다음과 같습니다 login() 방법, 호출해야합니다 :

    public void login() { 
    
          logging_in = true; 
          Log.i(TAG, "Loggin in"); 
          synchronized (this) { 
    
            // 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.getActiveSession().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) { // User is logged in 
    
                 app.setUser(user); 
                 app.setLoggedIn(true); 
    
                 // Redirect user to the HomeActivity 
                 Intent intent = new Intent(getBaseContext(), HomeActivity.class); 
                 startActivity(intent); 
    
                } 
               } 
              }); 
    
             } 
            } 
            }); 
    
            logging_in = false; 
    
          } 
    
    
        } 
    

    마지막을, 페이스 북 세션 내 콜백은 다음과 같습니다

    private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
         if (state.isOpened()) { 
    
          synchronized (this) { 
            if(! logging_in) { 
             login(); 
            } 
    
          } 
    
    
         } else if (state.isClosed()) { 
    
          setContentView(R.layout.login); 
    
         } 
        } 
    

    그것은 모든 것을 않습니다 음, login() 메쏘드가 여러 번 호출되는 것을 제외하고는. 내 로그의 출력은 다음과 같습니다

    enter image description here

    왜이 전화를받을 않습니다 너무 여러 번? 분명히 HomeActivity 인 텐트를 여러 번 시작해야합니다. 나는 이유를 알 수 없다.

    솔루션 내 Session.StateCallback에게 조금 변경되었습니다. 지금은 다음과 같습니다

    private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
         if (state.isOpened()) { 
    
          if(state == SessionState.OPENED_TOKEN_UPDATED) { 
    
           Log.i(TAG, "OPENED_TOKEN_UPDATED"); 
           login(); 
    
          } else if (state == SessionState.OPENED) { 
    
           if(app.getUser() != null) { 
    
            // Redirect user to the HomeActivity 
            Intent intent = new Intent(getBaseContext(), HomeActivity.class); 
            startActivity(intent); 
    
           } else { 
    
            login(); 
    
           } 
    
          } 
    
    
         } else if (state.isClosed()) { 
    
          if(state == SessionState.CLOSED_LOGIN_FAILED) { 
           Log.i(TAG, "CLOSED_LOGIN_FAILED"); 
    
           setContentView(R.layout.login); 
    
          } else if(state == SessionState.CLOSED) { 
    
           Log.i(TAG, "CLOSED"); 
           //setContentView(R.layout.login); 
          } 
    
    
    
         } 
        } 
    
  • 답변

    2

    그것의 대부분은 onSessionState에서 로그인을 호출하고 있기 때문에이 변경되었습니다.

    세션에 로그인 할 때 로그인 할 때 올바르게 변경 될 것입니다. 그리고 변경되면 onSessionState가 변경되고 login을 호출합니다.

    나는 루프가 무한대로 퍼지기를 기대하지만, 페이스 북은이를 위해 약간의 처리를 한 것으로 보인다.

    +0

    고마워. state == SessionState.OPENED 일 때 이제 다음 Activity로 리디렉션됩니다. 내가 올바른 방향으로 나를 지적했기 때문에 나는 대답을 받아 들일 것이다. –

    1

    나는 또한 동일한 문제에 직면했다. 나는 방금 내 활동 결과 코드를 변경했다. 그리고 그것은 ..