2012-12-14 14 views
18

Próbuję użyć Facebook SDK 3.0, aby odzyskać token dostępu po naciśnięciu przycisku w mojej aplikacji na Androida. Mam rodzajowe przycisk w mojej działalności, które są w następujący sposób:Android Facebook SDK3.0, stan sesji OTWARCIE

Button facebook = (Button)findViewById(R.id.facebookLoginButton); 
    facebook.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Session session = new Session(getApplicationContext()); 
      Session.setActiveSession(session); 
      session.openForRead(new Session.OpenRequest(SignInActivity.this).setCallback(statusCallback)); 
     } 
    }); 

a następnie callback:

private class FacebookSessionStatusCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
      String s=session.getAccessToken(); 
    } 
} 

Kliknięcie przycisku skłania mnie do mojego pozwolenia na dostęp do mojego profilu zgodnie z oczekiwaniami, ale ten callback jest zawsze wywoływany tylko raz z SessionState jako "OPENING". Stan nie zmienia się po tym.

Czego mi tu brakuje? Moim celem końcowym jest uzyskanie jednorazowego tokena dostępu i nie zależy mi na utrzymywaniu sesji ani używaniu jej do logowania do mojej aplikacji.

Odpowiedz

69

Musisz zastąpić parametr onActivityResult, aby po sprawdzeniu poświadczeń w serwisie Facebook na Androida (lub w logowaniu wbudowanym) wyniki były przetwarzane i sesja była aktualizowana. Dodaj następujący kod:

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

To była szybka naprawa, dzięki! Szybkie pytanie kontrolne - jak ustawić kod żądania, aby sprawdzić, czy pochodzi on z Facebooka, czy nie w onActivityResult? –

+0

Zobacz https://developers.facebook.com/docs/reference/android/3.0/Session.OpenRequest, ale możesz zrobić coś takiego: session.openForRead (new Session.OpenRequest (SignInActivity.this) .setCallback (statusCallback) .setRequestCode (200)); następnie sprawdź kod 200 w tym przykładzie. –

+0

@CAbernathy: Zaoszczędziłem mój dzień ... +1 za to. – Anukool

1

@Lucas Jota: Spróbuj zmienić kod żądania. to działa dla mnie. session.openForRead (new Session.OpenRequest (LoginActivity.this) .setCallback (statusCallback) .setRequestCode (urRequestCode)); Upewnij się również, że Twoja aktywność nie ma "pojedynczego wystąpienia" jako właściwości.

+1

Dzięki za przypomnienie "upewnij się, że twoja aktywność nie ma" pojedynczego wystąpienia "jako właściwości. Próbowałem użyć klasy singleton, okazało się, że po raz drugi się loguję, funkcja onActivityResult nie jest wywoływana –

+0

@Yu Lu Your komentarz jest Life Saver ... Robiłem wszystko dobrze, ale wciąż miałem problemy.W moim manifeście ustawiłem noHistory = "true", który był przyczyną problemu. – AB1209