2015-09-27 5 views
10

Używam Facebook SDK (4. *) na Androida. Po prostu zaimplementowano programowo logowanie (bez użycia "LoginButton") przy użyciu LoginManager 's logInWithReadPermissions(). Aby zadzwonić, zadzwoń pod numer FacebookCallbackManager.onActivityResult(requestCode, resultCode, data);, który wykonuję w metodzie mojej aktywności onActivityResult.Gdzie jest stała kodu żądania (64206) dla logowania zdefiniowanego w Facebook SDK

Jednak mój onActivityResult obsługuje wyniki z kilku powracających działań i sprawdza requestCode, aby zobaczyć, które działanie zostało zwrócone. Widzę, że login na facebooku wraca z 64206, ale nie jestem w stanie ustalić, gdzie jest określona ta stała. Nie chcę kodowania 64206 i zastanawiałem się: czy ktoś wie gdzie jest ten kod wynikowy zdefiniowany w SDK Facebooka (i czy jest publiczny)?

+0

: kod żądanie '64206' jest po prostu' 0xface'. Sprawdź odpowiedź poniżej. –

+0

Podobnie, kod żądania '64207' jest' CallbackManagerImpl.RequestCodeOffset.Share.toRequestCode() '. –

Odpowiedz

21

Więc ostatecznie zdecydowałem się zagłębić w debuggera i znalazłem go w Facebook SDK. Kody żądań są zdefiniowane w CallbackManagerImpl.RequestCodeOffset.

Możesz otrzymać kod żądania logowania w ten sposób: CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode().

Nie znajdziesz również kody do Share, Message, Like, GameRequest, AppGroupCreate, AppGroupJoin, AppInvite.

3

Nie powinieneś naprawdę przejmować się rzeczywistą wartością wewnętrznie użytego kodu żądania Facebooka, ponieważ w wyniku CallbackManager.onActivityResult(requestCode, resultCode, data) dowiesz się, czy zostało ono obsłużone, czy nie. Oznacza to, że najpierw zaoferować wynik do CallbackManager. Jeśli wskazuje, że był obsługiwany, wszystko gotowe. Jeśli nie był obsługiwany, jest to jeden z twoich pozostałych wyników kodu żądania, więc kontynuuj logikę, którą już masz.

Z docs on CallbackManager:

/** 
* The method that should be called from the Activity's or Fragment's onActivityResult method. 
* @param requestCode The request code that's received by the Activity or Fragment. 
* @param resultCode The result code that's received by the Activity or Fragment. 
* @param data  The result data that's received by the Activity or Fragment. 
* @return true If the result could be handled. 
*/ 
public boolean onActivityResult(int requestCode, int resultCode, Intent data); 

Zanotuj @return uwaga.

Więc w zasadzie, kod powinien być skonstruowany nieco jak poniżej:

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    boolean handled = callbackManager.onActivityResult(requestCode, resultCode, data); 
    if (handled) { /* all done */ } 
    else { /* result wasn't handled by the callback manager, so check for other potential request codes */ } 
} 

Jeśli naprawdę chcesz, możesz zanurzyć się w źródle Facebook SDK prześledzić pochodzenie kodu żądania. W szczególności odwołaj się do CallbackManagerImpl, gdzie statyczne wywołania zwrotne są konfigurowane z predefiniowanym przesunięciem kodu żądania.

+2

Istnieją dwa problemy z tym podejściem: 1. Większy problem: Nie chcę wywoływać kodu zewnętrznego z wynikiem "Dane intencyjne", które (mogą) zawierać poufne informacje. 2. Mniejsza kwestia: nie jest wydajna (i jest niechlujna). Co jeśli będę musiał połączyć się z kilkoma zewnętrznymi programami obsługi onActivityResult za każdym razem, np. jeśli używam kilku zewnętrznych bibliotek ... – Ognyan

+0

@Ogre_BGR: 1. Następnie wystarczy odwrócić if-else, aby nie dostać się do drugiej, jeśli istniał "wrażliwy przypadek danych" (jeśli tak naprawdę martwisz się o, nie powinieneś używać * żadnych * bibliotek, więc trochę punktu spornego). 2. Subiektywnie w najlepszym przypadku.Mówisz niechlujnie, ktoś inny może twierdzić, że jest odwrotnie, ponieważ wynik jest następnie przetwarzany w kontekście, z którego wywołano żądanie. Również zależy od tego, jak definiujesz efektywność: posiadanie dedykowanego modułu obsługi jest prostym sposobem uniknięcia powielania kodu. W każdym razie, ostatecznie to zależy od ciebie. Wszystko, co zrobiłem, to rozsądne rozwiązanie twojego problemu. :) –

+0

Tak, jest to subiektywne, ale mam tendencję do grawitacji w kierunku wyraźnego porównania kodu żądania. Jest jedna rzecz, która przeszkadza mi w rozwiązaniu, które dostarczyłem w odpowiedzi na moje własne pytanie, że 'RequestCodeOffset' jest zagnieżdżony w' CallbackManagerImpl' i jeśli Facebook zdecyduje się dostarczyć nową implementację 'CallbackManager', może wycofać' CallbackManagerImpl' i mój kod będą musiały zostać zmienione (ale w przypadku FB kilkakrotnie przeżyliśmy to, więc już nic wielkiego :-)). – Ognyan

4

lepiej jest zadzwonić FacebookSdk.getCallbackRequestCodeOffset()

+4

Po sprawdzeniu FacebookSdk, znalazłem, że istnieje metoda boolean isFacebookRequestCode (int requestCode). – dabicho

Powiązane problemy