WebView.loadUrl (url, encabezados) no funciona en android

Estoy estableciendo la cookie en los encabezados y llamar a WebView.loadUrl () con este encabezado, pero que (Cookie en el encabezado) no funcionará en cualquier dispositivo de Android excepto 4.4. He probarlo en android versiones 4.2, 4.3, 4.4, 5.0 y 5.1.

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

¿Has probado esto

  CookieManager.getInstance().setAcceptCookie(true); 

Si estás usando Android Lollipop, entonces

 CookieManager.getInstance().setAcceptCookie(true); 

No funciona. Necesitas usar

 CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

Para configurar la cookie, utilice el siguiente método

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

Asegúrese de que el punto final base coincida con la url de base de los enlaces abiertos en la vista web.

Para eliminar la cookie

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

Debido a Cookie Policy, para arreglarlo, debes agregar esto:

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

Esta es sólo una publicación rápida sobre la adición de cookies a una vista web. Si alguna vez has tratado de hacer esto de la manera que la mayoría de la gente ha dicho que debe hacerse, has fracasado miserablemente y encontró este post. 🙂

La forma en que se supone que funciona es que establezca la cookie en el CookieManager y, a continuación, decir el CookieSyncManager para sincronizar.

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

Nunca he conseguido que esto funcione como se describe. Con o sin tareas asíncronas esperando que los hilos se pongan al día.

En su lugar, sólo añadir la cookie en el encabezado de todas las llamadas 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 ); 

Advertencia: Sólo necesito cargar inicialmente la cookie apropiada para la solicitud, si quieres cubrir llamadas anidadas desde dentro del navegador, necesitas anular el comando shouldOverrideUrlLoading.

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

Si necesita inyectar la cookie para todas las solicitudes (incluyendo imágenes, js, etc), va a necesitar anular shouldInterceptRequest ,

Conseguí la solución para el problema creando el encargado de la galleta de encargo:

 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 inicialice el gestor de cookies personalizado en la clase de aplicación o cuando la aplicación se inicie como:

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

Si está usando Android Lollipop, es decir, SDK 21, entonces:

 CookieManager.getInstance().setAcceptCookie(true); 

No funciona. Usted necesita usar:

 CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

Me encontré con el mismo problema y la línea anterior funcionó como un encanto.

  • Cómo manejar la intención: // en una URL webView?
  • Pasa variable de android a JavaScript lanzado en webview
  • Android: minHeight no funciona en la vista web
  • Url abierta en pantalla completa en lugar de Webview
  • Android WebView: métodos de la actividad de llamada forma interfaz JavaScript
  • Android webview cargar Javascript local
  • ¿Por qué está desfasado el LayoutAlgorithm.SINGLE_COLUMN de WebView?
  • Reproducción tardía de la webview de Android
  • Cómo arreglar "Falta un arrastre mientras esperamos la respuesta de WebCore para tocar hacia abajo"
  • Problema con la vista web no cargando
  • Contenido wrap de WebView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.