2010-12-12 2 views
5

Okey, wykonałem całą operację, wykonałem wszystkie kroki, ale nadal nie mogę jej uruchomić. Prosta przykładowa aplikacja dostarczana wraz z pakietem SDK Facebooka działa na emulatorze i na urządzeniach z Androidem 1.5. Więc zgaduję, że jest to jedyny sposób logowania.Facebook SDK dla Androida - Przykładowa aplikacja nie zadziała

Jeśli mam rację wtedy należy wygenerować klucz hash i powiedziano mi, że prawo debug kluczy znajduje się pod

C: \ Users \ xxx.android \ debug.keystore

więc poszedłem za tutorialem.

Pobrano OpenSSL z google.code aw terminalu piszę coś takiego:

"C: \ Program Files \ Java \ jdk1.6.0_22 \ bin \ keytool.exe" -exportcert -alias androiddebugkey -keystore "C: \ Users \ JoeZ.android \ debug.keystore" | "C: \ Users \ xxx \ Downloads \ openssl-0.9.8k_X64 \ bin \ openssl.exe" sha1 -binary | "C: \ Users \ xxx \ Downloads \ openssl-0.9.8k_X64 \ bin \ openssl.exe "base64

i otrzymuję niezły klucz, który mogę wciśnięty w pole Key Key na Androidzie, próbowałem zarówno z znakiem lub po znaku = po wyjściu, ale nic nie działa.

Po prostu otrzymuję invalid_key, gdy próbuję zalogować się do aplikacji Przykład. Próbowałem nawet podpisanej aplikacji, ale to nie zadziałało. A jeśli się nie mylę, jedyną rzeczą do napisania w przykładowej aplikacji jest mój APP_ID, prawda?

Mam dokładnie ten sam problem z moją własną aplikacją, którą rozwijam. Więc proszę, niech ktoś mi pomoże?

Odpowiedz

15

Jeśli polecenie keytool nie działa dla ciebie, znalazłem sposób na obejście tego problemu: możesz po prostu odtworzyć ten klucz, który chcesz umieścić jako Key Hash w sekcji Developer na Facebooku. W ramach swojej działalności wystarczy wydrukować Key Hash, wykonując:

try { 
    PackageInfo info = getPackageManager().getPackageInfo("[your package name, e.g. com.yourcompany.yourapp]", PackageManager.GET_SIGNATURES); 
    for (Signature signature : info.signatures) { 
     MessageDigest md = MessageDigest.getInstance("SHA"); 
     md.update(signature.toByteArray()); 
     Log.d("Hash Key:", Base64.encode(md.digest())); 
    } 
} catch (NameNotFoundException e) { 

} catch (NoSuchAlgorithmException e) { 

} 

To zadziałało dla mnie. Klasa MessageDigest jest zawarta w pakiecie JDK. Klasa Base64 nie. Możesz użyć na przykład this one.

+0

Działa jak urok na mojej aplikacji :-) +1 –

+1

To nie działa dla mnie. Wystąpił błąd "Kodowanie metody (ByteBuffer, ByteBuffer) w typie Base64 nie ma zastosowania dla argumentów (byte [])" powyżej Base64.encode (md.digest())); Wyliczyłem to, musiałem zmienić na encodeBytes – easycheese

+0

To działało świetnie dla mnie! Dziękuję Ci! – Mutmatt

5

Miałem podobny problem. Dla mnie został rozwiązany, kiedy odinstalowałem najnowszą aktualizację aplikacji Facebook i teraz mam tylko natywną aplikację Facebook v1.2. (Oznacza to, że gdy wejdę na rynek i wyszukuję Facebooka, "Facebook dla Androida" będzie wyświetlany jako "nie zainstalowany" na moim urządzeniu).

Na moim Nexusie One (Android 2.2.1), kiedy miałem zainstalowaną najnowszą aplikację Facebook, nie było "odinstalować" aplikacji, tylko "Odinstaluj najnowsze aktualizacje", co zrobiłem. W rzeczywistości nie mogę nawet odinstalować całej aplikacji Facebook (teraz v1.2) z jakiegokolwiek powodu, przycisk odinstalowania jest wyłączony/wyszarzony. Ale w tym stanie próbki działają.

Przynajmniej mógłbym dostać prostą aplikację do streamowania i działać w ten sposób.

Edycja/Rozwiązanie:

Ok, mam to działa teraz. Zauważyłem, że skopiowałem/wkleiłem nieprawidłowy klucz skrótu, z powodu dziwnego zachowania keytool w oknach i niewłaściwej składni polecenia w pliku ReadMe pakietu SDK Facebooka.

Parametrem, który ma być użyty, powinno być "keytool -export ...", a nie "keytool -exportcert ..."; jeśli użyjesz drugiego/błędnego parametru, keytool nadal będzie drukował klucz hash (nie pytając o żadne kluczowe hasło), ale hash jest błędny.

Teraz mam również funkcję SSO.

To moje wezwanie na oknach:

keytool -export -alias androiddebugkey -keystore "C:\Documents and Settings\myuser\.android\debug.keystore" | openssl sha1 -binary | openssl enc -a -e 
+0

To działa, ale niestety nie jest rozwiązaniem. Jeśli rozumiem to poprawnie Pojedynczy login oznacza, że ​​powinien działać bez logowania i po prostu poprosić o pozwolenie. Jeśli jednokrotne logowanie nie istnieje na urządzeniu, zostanie ono przywrócone do prostego widoku WWW. Domyślam się, że jeśli odinstaluję aktualizacje, pojedyncze logowanie zostanie dezaktywowane i muszę się zalogować. Co oznacza, że ​​aplikacja przykładowa będzie działać. Więc jeśli mam rację, muszę zrobić coś złego. –

+0

Rozumiem to tak samo jak ty, ale także nie sprawiło, że zadziałało. Proszę zaktualizować, jeśli otrzymasz jakieś wiadomości na ten temat, zrobi to samo. –

+0

Opracowałem poprawkę, po prostu skomentowałem linie w metodzie, która sprawdza pojedyncze logowanie w klasie na Facebooku. Metoda jest następująca: Publiczna autoryzacja void (aktywność aktywności, uprawnienia String [], int activityCode, końcowy detektor DialogListener) { mAuthDialogListener = detektor; StartDialogAuth (aktywność, uprawnienia); } –

0

Próbowałem na okna jak na swoje rozwiązania z wykorzystaniem zarówno eksport i exportcert ale generuje sam hash. Aplikacja działa teraz jak wcześniej i nie używa nowego sposobu logowania jednokrotnego.

I debugowałem Androida SDK FB, znalazłem przyczynę, ale nie jest to dokładne rozwiązanie. Nie wiem, dlaczego faceci z Facebooka zaimplementowali SSO w ten sposób.

  1. SSO nie działa, jeśli nie masz zainstalowanej nowej aktualizacji FB na swoim telefonie z Androidem.

  2. W tym przypadku prowadzi do zwykłego interfejsu dialogowego z nazwą użytkownika i hasłem.

3.In szczegóły, FB Android SDK obsługiwać SSO, dzwoni zamiarem com.facebook.katana.ProxyAuth zwróci true jeśli aktualizacja jest dostępna.

  1. Jeśli użytkownik ma nową aktualizację i jest już zalogowany, to sprawdza użytkownika.

Mam nadzieję, że to pomoże.