2011-12-05 16 views
15

Con mi código a continuación, he podido guardar una cookie, pero tan pronto como cierre la aplicación la cookie desaparece.¿Cómo guardar una cookie en una vista web de Android para siempre?

¿Cómo se causa esto y cómo puedo solucionarlo?

package com.jkjljkj 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Window; 
import android.webkit.CookieSyncManager; 
import android.webkit.WebChromeClient; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.Toast; 

public class Activity extends Activity { 

    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     CookieSyncManager.createInstance(getBaseContext()); 

     // Let's display the progress in the activity title bar, like the 
     // browser app does. 


     getWindow().requestFeature(Window.FEATURE_PROGRESS); 

     WebView webview = new WebView(this); 
     setContentView(webview); 


     webview.getSettings().setJavaScriptEnabled(true); 

     final Activity activity = this; 
     webview.setWebChromeClient(new WebChromeClient() { 
     public void onProgressChanged(WebView view, int progress) { 
      // Activities and WebViews measure progress with different scales. 
      // The progress meter will automatically disappear when we reach 100% 
      activity.setProgress(progress * 1000); 
     } 
     }); 

     webview.setWebViewClient(new WebViewClient() { 

     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
       //Users will be notified in case there's an error (i.e. no internet connection) 
       Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show(); 
     } 
     }); 

     CookieSyncManager.getInstance().startSync(); 
     CookieSyncManager.getInstance().sync(); 

    //This will load the webpage that we want to see 
     webview.loadUrl("http://"); 

    } 
} 
+0

CookieSyncManager ahora está en desuso, use CookieManager. http: // stackoverflow.com/questions/30502411/cookiesyncmanager-es-ahora-obsoleto-qué-puedo-usar-en cambio –

+0

@Rahul Sahni Lo intenté, pero si cierro la aplicación y vuelvo a abrir, ¡tengo que volver a iniciar sesión y perder todas las cookies! ¿Podría decirme cuál podría ser el problema? – user1788736

Respuesta

35

usted tiene que decir la CookieSyncManager sincronizar después de que se haya cargado la página en cuestión. En el código de muestra, el método onCreate se ejecuta por completo antes de que el WebView intente cargar la página, por lo que el proceso de sincronización (que se realiza de forma asíncrona) probablemente se completará antes de que se cargue la página.

En su lugar, indique al CookieSyncManager que se sincronice en PageFinished en el WebViewClient. Eso debería darte lo que quieres.

El CookieSyncManager Documentation es una buena lectura de cómo hacer esto correctamente.

Aquí es cómo se puede configurar su aplicación WebViewClient a hacer esto para usted:

webview.setWebViewClient(new WebViewClient() { 
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
     //Users will be notified in case there's an error (i.e. no internet connection) 
     Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show(); 
    } 

    public void onPageFinished(WebView view, String url) { 
     CookieSyncManager.getInstance().sync(); 
    } 
); 

No tendría que decir la CookieSyncManager sincronizar otro lugar con este en su lugar. No lo he probado, así que avíseme si funciona.

+0

Soy completamente nuevo ... ¿Me puedes dar un código real? Eso ayudaría mucho! – Joe

+1

Ahí tienes. Darle un giro. – lyricsboy

+2

¡Rock! Eso funcionó perfectamente ... genio puro! Gracias amigo! – Joe

4

.sync() consiste en forzar una sincronización inmediata, y se debe invocar después de la carga de la página porque sincroniza la memoria RAM con la memoria caché, por lo que las cookies deben estar en memoria ram antes de invocarla.

sistema SYNC automáticamente cada 5 mintuos si se utiliza este esquema

onCreate: 
CookieSyncManager.createInstance(context) 

onResume: 
CookieSyncManager.getInstance().startSync() 

onPause: 
CookieSyncManager.getInstance().stopSync() 

Creo que no esperamos 5 mintuos lo que el sistema guardar galletas.

+0

¿Qué debo hacer si quiero sincronizar las cookies inmediatamente sin esperar 5 minutos en android 6? – user1788736

0

Para aquellos que enfrentan problemas con la clase CookieManager para hacer que persistan las cookies incluso después de cerrar la aplicación, deben probar la función flush() de CookieManager.

Tenga en cuenta que no lo he probado, así que si funciona, hágamelo saber también.

Según la documentación androide

void flush()

Asegura todas las cookies actualmente accesibles a través de la API GetCookie se escriben en el almacenamiento persistente. Esta llamada bloqueará a la persona que llama hasta que finalice y puede realizar E/S.

También en CookieSyncManager documnentation está escrito que:

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

+0

@ user1788736 espero que esto te ayude –

Cuestiones relacionadas