webview shouldinterceptrequest example

Necesito saber cómo funciona el trabajo de shouldinterceptrequest . No sé cómo crear y manejar este método para leer y reemplazar el enlace CSS. ¡Gracias!

Bueno, la respuesta corta es que funciona bastante similar a shouldOverrideUrlLoading(WebView view, String url) , como se ilustra en el tutorial de WebView .

Para comenzar, mira el código a continuación. Simplemente anula el shouldInterceptRequest(WebView view, String url) de su WebViewClient. Obviamente no tienes que hacer eso en línea, pero para compactarlo es lo que hice:

  WebView webview = (WebView) findViewById(R.id.webview); webview.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest (final WebView view, String url) { if (url.contains(".css")) { return getCssWebResourceResponseFromAsset(); } else { return super.shouldInterceptRequest(view, url); } } /** * Return WebResourceResponse with CSS markup from a String. */ @SuppressWarnings("deprecation") private WebResourceResponse getCssWebResourceResponseFromString() { return getUtf8EncodedCssWebResourceResponse(new StringBufferInputStream("body { background-color: #F781F3; }")); } /** * Return WebResourceResponse with CSS markup from an asset (eg "assets/style.css"). */ private WebResourceResponse getCssWebResourceResponseFromAsset() { try { return getUtf8EncodedCssWebResourceResponse(getAssets().open("style.css")); } catch (IOException e) { return null; } } /** * Return WebResourceResponse with CSS markup from a raw resource (eg "raw/style.css"). */ private WebResourceResponse getCssWebResourceResponseFromRawResource() { return getUtf8EncodedCssWebResourceResponse(getResources().openRawResource(R.raw.style)); } private WebResourceResponse getUtf8EncodedCssWebResourceResponse(InputStream data) { return new WebResourceResponse("text/css", "UTF-8", data); } }); webview.loadUrl("http://stackoverflow.com"); 

Capture la carga del archivo css y devuelva su propia WebResourceResponse contenga los datos que desea cargar en lugar.

Tenga en cuenta que este método requiere API nivel 11 .

Si desea hacer algo similar para Android 2.x, puede intentar usar el antes mencionado shouldOverrideUrlLoading(WebView view, String url) para evitar cargar la página, buscarla manualmente, reemplazar la referencia al archivo css por la suya. y finalmente loadData(String data, String mimeType, String encoding) (o loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) ) en WebView, pasando el contenido html manipulado como una cadena.

Antes de:

antes de

Después:

Después

esto también podría ser interesante para ti. Lee archivos de carpetas específicas y si hay una solicitud entrante con este nombre de archivo, utiliza el archivo de la carpeta de activos y no el de la web.

  //get list of files of specific asset folder private ArrayList listAssetFiles(String path) { List myArrayList = new ArrayList(); String [] list; try { list = getAssets().list(path); for(String f1 : list){ myArrayList.add(f1); } } catch (IOException e) { e.printStackTrace(); } return (ArrayList) myArrayList; } //get mime type by url public String getMimeType(String url) { String type = null; String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null) { if (extension.equals("js")) { return "text/javascript"; } else if (extension.equals("woff")) { return "application/font-woff"; } else if (extension.equals("woff2")) { return "application/font-woff2"; } else if (extension.equals("ttf")) { return "application/x-font-ttf"; } else if (extension.equals("eot")) { return "application/vnd.ms-fontobject"; } else if (extension.equals("svg")) { return "image/svg+xml"; } type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); } return type; } //return webresourceresponse public WebResourceResponse loadFilesFromAssetFolder (String folder, String url) { List myArrayList = listAssetFiles(folder); for (Object str : myArrayList) { if (url.contains((CharSequence) str)) { try { Log.i(TAG2, "File:" + str); Log.i(TAG2, "MIME:" + getMimeType(url)); return new WebResourceResponse(getMimeType(url), "UTF-8", getAssets().open(String.valueOf(folder+"/" + str))); } catch (IOException e) { e.printStackTrace(); } } } return null; } //@TargetApi(Build.VERSION_CODES.LOLLIPOP) @SuppressLint("NewApi") @Override public WebResourceResponse shouldInterceptRequest(final WebView view, String url) { //Log.i(TAG2, "SHOULD OVERRIDE INIT"); //String url = webResourceRequest.getUrl().toString(); String extension = MimeTypeMap.getFileExtensionFromUrl(url); //I have some folders for files with the same extension if (extension.equals("css") || extension.equals("js") || extension.equals("img")) { return loadFilesFromAssetFolder(extension, url); } //more possible extensions for font folder if (extension.equals("woff") || extension.equals("woff2") || extension.equals("ttf") || extension.equals("svg") || extension.equals("eot")) { return loadFilesFromAssetFolder("font", url); } return null; }