2010-11-02 21 views
25

En mi aplicación de Android, cada actividad está llena de datos de un archivo xml que está en algún lugar de la web. El sitio web que proporciona estos archivos tiene un mecanismo de inicio de sesión que funciona con cookies.Android: ¿Cómo almacenar cookies?

Sé cómo hacer una solicitud HTTP a la página de inicio de sesión y recibir una cookie. Lo que no sé es cómo puedo almacenarlo para volver a usarlo en otras actividades Y cuando la aplicación se inicia la próxima vez. La cookie es válida por un año, por lo que el usuario de mi aplicación debe iniciar sesión una vez y nunca más durante todo un año.

Cómo lo hago? Busqué mucho en Google, pero o utilicé las palabras clave incorrectas o no hay soluciones simples en Internet. Espero que alguien aquí pueda ayudarme.

Un saludo y gracias de antemano, Jan Oliver

+0

¿Está usando AndroidHttpClient? ¿Has confirmado que no están siendo almacenados? Creo que la implementación de AndroidHttpClient trata de forma persistente con la tienda de cookies. – cistearns

+2

Se almacenan de la forma en que las siguientes solicitudes que utilizan el mismo httpclient lo reconocen. Pero no se conservan después de cerrar la aplicación o cambiar la actividad y crear nuevas instancias de httpclient. – janoliver

Respuesta

9

Parece que Android está utilizando la versión predeterminada t en la implementación de la memoria, por lo que deberá crear su propio almacén de cookies persistente.

Este tutorial de Java describe la creación de su propia tienda persistente aprovechando la implementación predeterminada. http://download.oracle.com/javase/tutorial/networking/cookies/custom.html

La muestra tiene dos tareas para el almacenamiento (lectura/escritura) Para el almacenamiento, simplemente usaría SharedPreferences para almacenar solo la cookie de sesión que necesita y no para conservar ninguna otra.

La muestra utiliza un gancho de apagado que no es lo que desea en Android. En lugar de ejecutar() y el enlace, simplemente tendría un nuevo método público persist() que guarda lo que desea, aunque eso requiere que persista() la tienda a mano.

Teniendo en cuenta que sólo tiene uno o dos galletas de que la materia se puede ahorrar en el complemento (...)

+0

Gracias por la respuesta que estaba buscando. Desafortunadamente lo resolví almacenando las credenciales de inicio de sesión ahora e ingresando cada vez que inicio la aplicación. El HttpClient se comparte entre Activites a través de una clase estática. ¡Pero gracias de cualquier manera! – janoliver

+0

¿Por qué un gancho de apagado no es bueno? – slezica

+0

Uso de Runtime addShutdownHook debe evitarse en Android: de la documentación de Android sobre esa función "Tenga en cuenta que en Android, el ciclo de vida de la aplicación no incluye la terminación de VM, por lo que llamar a este método no garantizará la ejecución de su código. utilice la notificación de ciclo de vida más apropiada (Activity.onPause, por ejemplo). " – cistearns

3

Después de realizar su llamada http, se puede agarrar las galletas de este tipo

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(); 
     } 
    } 
} 

Para enviar de vuelta:

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

aList es todo su nombreValuePairs

+0

¿Has leído mi pregunta? Estaba preguntando cómo almacenar las cookies en mi aplicación para su uso futuro en otras actividades e incluso otras ejecuciones de mi aplicación. – janoliver

+0

Eso es lo que hace la primera parte, extrae las cookies que ha recibido de un sitio. En el ejemplo, está tomando la cookie llamada "PHPSESSID". Luego puede almacenarlo en una Cadena. La segunda parte muestra cómo devolver la cookie al servidor en páginas posteriores. – Jim

+0

¿Qué sucede si quiero guardar todas las cookies que envía el servidor? no solo los que atrapo? –

17

Utilice un CookieSyncManager para almacenar su valor de la cookie. Puede persistir durante el inicio de la aplicación.

Tenga cuidado con el uso de CookieSyncManager dentro de WebViewClient#shouldInterceptRequest en KitKat. It will deadlock.

EDITAR

CookieSyncManager desfasada y en su API 21:

Esta clase está desfasada y en el nivel API 21. El WebView ahora sincroniza automáticamente las cookies, según sea necesario. Ya no es necesario que cree ni use el CookieSyncManager. Para forzar manualmente una sincronización, puede usar el CookieManager método flush() que es un reemplazo síncrono para sync().

+4

En mi opinión, esta debería ser la respuesta correcta ... es tan simple como 'CookieSyncManager.getInstance(). Sync();' siempre que quiera que las cookies se guarden con persistencia (en lugar de RAM) –

+0

no es esto usado para persistir en la tienda de cookies del navegador? ¿Esto también persistirá en las cookies de un HttpClient dentro de una aplicación de Android? –

+0

Puede usar fácilmente el CookieSyncManager con HttpClient. Consulte http://stackoverflow.com/a/3587332/9636 para ver un ejemplo del procesamiento de cookies HttpClient. –