2015-07-03 9 views
13

Ustawiam ciasteczko w nagłówkach i wołam WebView.loadUrl() tym nagłówkiem, ale to (plik Cookie w nagłówku) nie będzie działać na żadnym urządzeniu z Androidem z wyjątkiem 4.4. Przetestowałem go na Androida w wersjach 4.2, 4.3, 4.4, 5.0 i 5.1.WebView.loadUrl (adres URL, nagłówki) nie działa w Androidzie

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

Odpowiedz

2

mam rozwiązanie problemu poprzez stworzenie kierownik zwyczaj cookies:

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

i zainicjować menedżera plików cookie w klasie niestandardowych aplikacji lub gdy uruchamiany jako:

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

To beceause Polityki Cookie, aby to naprawić, należy dodać to:

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

Próbowałem już tego rozwiązania, ale nie działa – user1041858

6

Jeśli używasz Androida Lollipop, następnie

CookieManager.getInstance().setAcceptCookie(true); 

nie będzie działać. Trzeba użyć

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

Aby ustawić ciasteczko użyć następującej metody

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

Upewnij się, że punkt końcowy baza pasuje do podstawowego adresu URL z linków otwartych w WebView.

Aby usunąć ciasteczka

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

To jest tylko szybki post na temat dodawania plików cookie do widoku internetowej. Jeśli kiedykolwiek próbowałeś robić to w sposób, w jaki większość ludzi powiedziała, że ​​powinno się to zrobić, nie udało ci się znaleźć tego postu. :)

Sposób, w jaki powinien działać, polega na ustawieniu cookie na CookieManager, a następnie nakazaniu synchronizacji CookieSyncManager.

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

Nigdy nie pracowałem tak, jak opisano. Z lub bez zadań asynchronicznych oczekujących na wątki do nadrobienia.

Zamiast tego po prostu dodaję plik cookie w nagłówku wszystkich wywołań 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); 

Zastrzeżenie: I tylko trzeba najpierw załadować odpowiedni plik cookie dla żądania, jeśli chcesz na pokrycie zagnieżdżonych wywołań od wewnątrz przeglądarki, trzeba zastąpić shouldOverrideUrlLoading.

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

Jeśli trzeba wstrzyknąć cookie dla wszystkich żądań (w tym zdjęć, JS, etc), będziesz musiał zastąpić shouldInterceptRequest,

0

Jeśli używasz Androida Lollipop tj SDK 21, a następnie:

CookieManager.getInstance().setAcceptCookie(true); 

nie będzie działać.Musisz użyć:

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

Wpadłem na ten sam problem, a powyższa linia działała jako urok.