2010-11-02 24 views
25

W mojej aplikacji na Androida każde działanie jest wypełniane danymi z pliku XML, który jest gdzieś w Internecie. Strona udostępniająca te pliki ma mechanizm logowania, który działa z plikami cookie.Android: jak przechowywać pliki cookie?

Wiem, jak utworzyć żądanie HTTP na stronie logowania i otrzymać plik cookie. To, czego nie wiem, to, jak mogę je zapisać, aby ponownie wykorzystać go w obu innych działaniach ORAZ przy następnym uruchomieniu aplikacji. Plik cookie jest ważny przez rok, więc użytkownik mojej aplikacji powinien logować się raz, a potem nigdy przez cały rok.

Jak to zrobić? Dużo googlowałem, ale albo użyłem niewłaściwych słów kluczowych, albo nie ma prostych rozwiązań w Internecie. Mam nadzieję, że ktoś tu może mi pomóc.

Pozdrawiam i dzięki z góry, Jan Oliver

+0

Czy używasz AndroidHttpClient? Czy potwierdziłeś, że nie są przechowywane? Uważam, że wdrożenie AndroidHttpClient w sposób ciągły zajmuje się przechowywaniem plików cookie. – cistearns

+2

Są one przechowywane w taki sposób, że rozpoznają je następujące żądania przy użyciu tego samego hosta httpclient. Ale nie są one zachowywane po zamknięciu aplikacji lub zmianie działania i tworzeniu nowych instancji httpclient. – janoliver

Odpowiedz

9

Wygląda na to, że Android używa defaulacji t w implementacji pamięci, więc będziesz musiał utworzyć własny magazyn trwałych plików cookie.

Ten samouczek języka Java przedstawia tworzenie własnego magazynu trwałego z wykorzystaniem domyślnej implementacji. http://download.oracle.com/javase/tutorial/networking/cookies/custom.html

Próbka ma dwa todo do przechowywania (odczyt/zapis) Do przechowywania Chciałbym po prostu użyć SharedPreferences do przechowywania tylko plik cookie sesji, które potrzebujesz i nie utrwalać żadnych innych.

W przykładzie zastosowano hak zamykający, którego nie ma w Androidzie. W miejsce run() i hooka po prostu miałbym nową publiczną metodę persist(), która zapisuje to, co chcesz, ale to wymaga ręcznego utrzymywania() magazynu.

Biorąc pod uwagę, że masz tylko jedno lub dwa ciasteczka że sprawa może je zapisać w dodatku (...)

+0

Dzięki za odpowiedź, której szukałem. Niestety rozwiązałem go, przechowując dane logowania teraz i logując się za każdym razem, gdy uruchamiam aplikację. HttpClient jest następnie dzielony między Activites za pośrednictwem klasy statycznej. Ale i tak dzięki! – janoliver

+0

Dlaczego hak wyłączający nie jest dobry? – slezica

+0

Należy unikać używania aplikacji Runtime addShutdownHook na Androidzie: z dokumentacji systemu Android na temat tej funkcji "Pamiętaj, że na Androidzie cykl życia aplikacji nie obejmuje zakończenia VM, więc wywołanie tej metody nie zapewni uruchomienia kodu. użyj najbardziej odpowiedniego powiadomienia o cyklu życia (Activity.onPause, powiedzmy). " – cistearns

3

Po dokonaniu połączenia http, można chwycić ciasteczka jak ten

List<Cookie> cookies = httpclient.getCookieStore().getCookies(); 
if (cookies.isEmpty()) { 
    Log.d(TAG,"no cookies received"); 
} else { 
    for (int i = 0; i < cookies.size(); i++) { 
     if(cookies.get(i).getName().contentEquals("PHPSESSID")) { 
     PHPSESSID = cookies.get(i).getValue(); 
     } 
    } 
} 

Aby wysłać je z powrotem:

nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid)); 
httppost.setEntity(new UrlEncodedFormEntity(aList)); 

aList to całe twoje imięValuePairs

+0

Czy przeczytałeś moje pytanie? Pytałem, jak przechowywać pliki cookie w mojej aplikacji do wykorzystania w przyszłości w innych działaniach, a nawet w innych działach mojej aplikacji. – janoliver

+0

Tak robi pierwsza część, pobiera pliki cookie, które otrzymałeś z witryny. W tym przykładzie przechwytuje plik cookie o nazwie "PHPSESSID". Możesz następnie zapisać go w ciągu znaków. Druga część pokazuje, w jaki sposób zwrócić cookie na serwer na stronach w późniejszym terminie. – Jim

+0

co jeśli chcę zapisać wszystkie pliki cookie wysyłane przez serwer? nie tylko te, które łapię? –

17

użyć CookieSyncManager aby zapisać wartość cookie. Może utrzymywać się na początku uruchamiania aplikacji.

Uwaga na użycie CookieSyncManager wewnątrz WebViewClient#shouldInterceptRequest na KitKat. It will deadlock.

EDIT

CookieSyncManager została zaniechana API 21:

Klasa ta została zaniechana poziomu API 21. WebView teraz automatycznie synchronizowane ciasteczka to konieczne. Nie musisz już tworzyć ani używać CookieSyncManager. Aby ręcznie wymusić synchronizację, można użyć metody CookieManager, która jest synchronicznym zamiennikiem dla sync().

+4

Moim zdaniem powinna to być właściwa odpowiedź ... jest tak prosta, jak "CookieSyncManager.getInstance(). Sync();" kiedy chcesz zapisać plik cookie z zachowaniem (zamiast pamięci RAM) –

+0

nie jest to używane utrzymywać magazyn plików cookie przeglądarki? czy to również będzie przechowywać pliki cookie na HttpClient w aplikacji na Androida? –

+0

Możesz całkiem łatwo użyć CookieSyncManager z HttpClient. Zobacz http://stackoverflow.com/a/3587332/9636 dla przykładu przetwarzania plików cookie HttpClient. –

Powiązane problemy