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()
메쏘드가 여러 번 호출되는 것을 제외하고는. 내 로그의 출력은 다음과 같습니다
왜이 전화를받을 않습니다 너무 여러 번? 분명히 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);
}
}
}
고마워. state == SessionState.OPENED 일 때 이제 다음 Activity로 리디렉션됩니다. 내가 올바른 방향으로 나를 지적했기 때문에 나는 대답을 받아 들일 것이다. –