2011-12-05 15 views
15

Con il mio codice qui sotto, sono stato in grado di salvare un cookie, ma non appena chiudo l'applicazione il cookie scompare.Come salvare un cookie in una webview Android per sempre?

Come è questo ha causato e come posso risolverlo?

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 è ora obsoleto, utilizzare CookieManager. http: // stackoverflow.it/questions/30502411/cookiesyncmanager-is-now-deprecated-what-can-i-use-invece –

+0

@Rahul Sahni L'ho provato, ma se chiudo l'app e riapri devo registrarmi e tutti i cookie persi! Potresti dirmi quale potrebbe essere il problema? – user1788736

risposta

35

Devi dire la CookieSyncManager per sincronizzare dopo che ha caricato la pagina in questione. Nel codice di esempio, il metodo onCreate viene eseguito completamente prima che lo WebView provi a caricare la pagina, quindi il processo di sincronizzazione (che avviene in modo asincrono) verrà probabilmente completato prima che la pagina venga caricata.

Invece, dire a CookieSyncManager di sincronizzare onPageFinished in WebViewClient. Questo dovrebbe farti quello che vuoi.

Il CookieSyncManager Documentation è una buona lettura per come farlo correttamente.

Ecco come è possibile impostare la propria implementazione WebViewClient a fare questo per voi:

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

Non avrebbe bisogno di dire al CookieSyncManager per sincronizzare altrove con questo posto. Non ho provato questo, quindi fammi sapere se funziona.

+0

Sono completamente nuovo ... Puoi darmi del codice vero? Ciò aiuterebbe una tonnellata! – Joe

+1

Ecco qua. Dagli un giro. – lyricsboy

+2

Sei rock! Ha funzionato perfettamente ... puro genio! Grazie amico! – Joe

4

.sync() consente di forzare una sincronizzazione immediata e deve essere chiamato dopo il caricamento della pagina, in quanto sincronizza la RAM con la cache, quindi il cookie deve trovarsi nella ram prima di chiamarlo.

Sistema di sincronizzazione automaticamente ogni 5 mintui se si utilizza questo schema

onCreate: 
CookieSyncManager.createInstance(context) 

onResume: 
CookieSyncManager.getInstance().startSync() 

onPause: 
CookieSyncManager.getInstance().stopSync() 

Credo che non si è aspettato 5 mintui in modo da salvare il sistema dei cookie.

+0

Cosa devo fare Se voglio sincronizzare i cookie immediatamente senza aspettare 5 minuti su Android 6? – user1788736

0

Per coloro che si trovano ad affrontare problemi con CookieManager classe per rendere biscotto persistono anche dopo la chiusura della app, dovrebbero provare la funzione di flush()CookieManager.

Si prega di notare che non ho provato questo, quindi se funziona, per favore fatemelo sapere anche.

Secondo la documentazione Android

void flush()

garantisce che tutti i cookie attualmente accessibili tramite l'API getCookie sono scritti in un archivio permanente. Questa chiamata bloccherà il chiamante fino a quando non sarà terminato e potrebbe eseguire I/O.

Anche in CookieSyncManager documnentation è scritto che:

Questa classe è stata sconsigliata a livello di API 21. La WebView ora sincronizza automaticamente i cookie, se necessario. Non è più necessario creare o utilizzare CookieSyncManager. Per forzare manualmente una sincronizzazione è possibile utilizzare il metodo CookieManager flush(), che è una sostituzione sincrona per sync(). CookieSyncManger link

+0

@ user1788736 spero che questo ti aiuti –

Problemi correlati