2015-07-03 15 views
13

Sto impostando il cookie nelle intestazioni e richiamo WebView.loadUrl() con questa intestazione ma esso (Cookie nell'intestazione) non funzionerà su nessun dispositivo Android tranne 4.4. Ho provato su Android versioni 4.2, 4.3, 4.4, 5.0 e 5.1.WebView.loadUrl (url, intestazioni) non funziona in Android

webView = (WebView) findViewById(R.id.web_view); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.getSettings().setDomStorageEnabled(true); 
webView.getSettings().setBuiltInZoomControls(true); 
webView.getSettings().setDisplayZoomControls(false); 


HashMap <String, String> extraHeaders = new HashMap<String, String>(); 
extraHeaders.put("Cookie", "{cookie value}"); 


webView.setWebViewClient(new WebViewClient() { 
    public boolean shouldOverrideUrlLoading(WebView view, String url){ 
      view.loadUrl(url, extraHeaders); 
       return false; 
     } 
}); 

webView.loadUrl(url, extraHeaders); 

risposta

2

ho ottenuto la soluzione per il problema creando la cookie personalizzato manager:

public class WebkitCookieManagerProxy extends CookieManager { 
    private android.webkit.CookieManager webkitCookieManager; 
    public WebkitCookieManagerProxy() { 
     this(null, null); 
    } 
    public WebkitCookieManagerProxy(CookieStore store, CookiePolicy cookiePolicy) { 
     super(null, cookiePolicy); 
     this.webkitCookieManager = android.webkit.CookieManager.getInstance(); 
    } 
    @Override 
    public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException { 
     // make sure our args are valid 
     if ((uri == null) || (responseHeaders == null)) return; 
     // save our url once 
     String url = uri.toString(); 
     // go over the headers 
     for (String headerKey : responseHeaders.keySet()) { 
      // ignore headers which aren't cookie related 
      if ((headerKey == null) || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey.equalsIgnoreCase("Set-Cookie"))) continue; 
      // process each of the headers 
      for (String headerValue : responseHeaders.get(headerKey)) { 
       this.webkitCookieManager.setCookie(url, headerValue); 
      } 
     } 
    } 
    @Override 
    public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders) throws IOException { 
     // make sure our args are valid 
     if ((uri == null) || (requestHeaders == null)) throw new IllegalArgumentException("Argument is null"); 
     // save our url once 
     String url = uri.toString(); 
     // prepare our response 
     Map<String, List<String>> res = new java.util.HashMap<String, List<String>>(); 
     // get the cookie 
     String cookie = this.webkitCookieManager.getCookie(url); 
     if (cookie != null) res.put("Cookie", Arrays.asList(cookie)); 
     return res; 
    } 
    @Override 
    public CookieStore getCookieStore() { 
     // we don't want anyone to work with this cookie store directly 
     throw new UnsupportedOperationException(); 
    } 
} 

e inizializzare il direttore del cookie personalizzato in classe Application o quando si avvia l'applicazione come:

android.webkit.CookieSyncManager.createInstance(this); 
android.webkit.CookieManager.getInstance().setAcceptCookie(true); 
WebkitCookieManagerProxy coreCookieManager = new WebkitCookieManagerProxy(null, java.net.CookiePolicy.ACCEPT_ALL); 
java.net.CookieHandler.setDefault(coreCookieManager); 
5

E 'beceause della politica sui cookie, per risolvere il problema, è necessario aggiungere questo:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    super.init(); 

    // Allow third party cookies for Android Lollipop 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     WebView webView = (WebView)super.appView; 
     CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.setAcceptThirdPartyCookies(webView,true); 
    } 

    super.loadUrl(Config.getStartUrl()); 
} 
+1

Ho già provato questa soluzione, ma non funziona – user1041858

6

Hai provato questo

CookieManager.getInstance().setAcceptCookie(true); 
+2

Sì, ma non funziona – user1041858

6

se si utilizza Android Lollipop, poi

CookieManager.getInstance().setAcceptCookie(true); 

non funziona. È necessario utilizzare

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 
6

Per impostare cookie di utilizzare il seguente metodo

CookieManager.getInstance().setCookie(BuildConfig.BASE_SERVER_ENDPOINT,COOKIE_VAL); 

Assicurarsi che il punto finale di base corrisponda l'URL di base dei collegamenti aperti in WebView.

Per rimuovere biscotto

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
       CookieManager.getInstance().removeAllCookies(null); 
      } else { 
       CookieManager.getInstance().removeAllCookie(); 
      } 
5

Questo è solo un post veloce su come aggiungere i cookie per una vista web. Se hai mai provato a farlo nel modo in cui la maggior parte delle persone ha detto che dovrebbe essere fatto, hai fallito miseramente e hai trovato questo post. :)

Il modo in cui deve funzionare è impostare il cookie sul CookieManager e quindi dire a CookieSyncManager di sincronizzarsi.

CookieManager.getInstance().setCookie(domain, value); 
CookieSyncManager.getInstance().sync(); 

Non ho mai funzionato come descritto. Con o senza attività asincrone in attesa che i thread raggiungano.

Invece, aggiungo semplicemente il cookie nell'intestazione di tutte le chiamate loadUrl.

Map<String, String> headers = new HashMap<String, String>(); 
headers.put("Cookie", "cookieName=cookieValue;domain=domain.com;path=/;Expires=Thu, 2 Aug 2021 20:47:11 UTC;"); 
webView.loadUrl("myurl.com", headers); 

Caveat: ho solo bisogno di caricare inizialmente il cookie appropriata per la richiesta, se si vuole coprire le chiamate nidificate dall'interno del browser, è necessario eseguire l'override shouldOverrideUrlLoading.

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url, headers); 
     return false; 
    } 
}); 

Se è necessario iniettare il cookie per tutte le richieste (incluse le immagini, JS, ecc), si sta andando ad avere bisogno di ignorare shouldInterceptRequest,

0

Se si utilizza Android Lollipop cioè SDK 21, quindi:

CookieManager.getInstance().setAcceptCookie(true); 

non funzionerà.È necessario utilizzare:

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

Ho incontrato lo stesso problema e la linea di cui sopra ha funzionato come un fascino.