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);
- Webview no puede cargar archivo html desde la tarjeta sd
- Android Webview: Ejecución de javascript desde el método java llamado desde javascript
- Abrir enlace desde Webview de Android en el navegador normal como popup
- Cargar archivo somefile.html desde el almacenamiento interno a una vista web de una aplicación
- Frameloader buscar extra UA String - UAProfURL
- Abrir PDF en WebView con un tamaño de archivo superior a 1 MB
- Ajustar imagen en la vista web
- Parpadeo de la vista Web / parpadea mientras se desplaza
- Aliasing del borde de radio de WebView de Android
- Transiciones de la página siguiente / anterior de WebView
- ¿Puedo pasar un objeto Javascript a una WebView de Android?
- WebView onPageFinished no se llama cuando MapView está visible
- Captura de pantalla de WebView en Android
¿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.
- Hacer referencia a la biblioteca de google-play-services
- Subclase de SupportMapFragment resultados en un NullPointerException