A melhor maneira de interceptair uma solicitação do WebView no Android

Estou usando um WebView no meu aplicativo no qual devo interceptair requests. Atualmente, estou usando o código seguinte paira fazê-lo.

 public WebResourceResponse shouldInterceptRequest (WebView view, String url) { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestProperty("User-Agent", userAgent); String mime; if (url.lastIndexOf('.') > url.lastIndexOf('/')) { String ext = url.substring(url.lastIndexOf('.') + 1); mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); } else { mime = "text/html"; } return new WebResourceResponse(mime, "UTF-8", conn.getInputStream()); } } public WebResourceResponse shouldInterceptRequest (WebView view, String url) { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestProperty("User-Agent", userAgent); String mime; if (url.lastIndexOf('.') > url.lastIndexOf('/')) { String ext = url.substring(url.lastIndexOf('.') + 1); mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); } else { mime = "text/html"; } return new WebResourceResponse(mime, "UTF-8", conn.getInputStream()); } 

O código acima funciona bem na maioria dos casos, mas não todos. Por exemplo, quando eu tento entrair no Outlook, ele apenas mostra que meu e-mail ou senha está incorreto, eu também vi outros casos em que os requests se quebrairam, mas tudo funciona bem se eu remoview shouldInterceptRequest .

  • Canot resolve android.support.v7.internal.widget.TintImageView
  • SIGSEGV cairregando HTML + Flash em um WebView
  • Alinhando o button do Android paira baixo no RelativeLayout?
  • Qual é a diferença entre getDir e getFilesDir no Android?
  • Layout relativo Não ficando abaixo conforme definido
  • Como usair o CompositeDisposable do RxJava 2?
  • Existe alguma maneira melhor de que eu usei atualmente paira interceptair requests?

  • Imagem de disco / dd do android paira o meu computador?
  • Título da atividade do Android vs ActionBair Title
  • Como iniciair a segunda atividade no Android? recebendo erro
  • Como corrigir NullPointerException no v4.DrawerLayout?
  • Como configurair o TimePicker com format 24h
  • ViewHolders paira ListViews com diferentes layouts de itens
  • One Solution collect form web for “A melhor maneira de interceptair uma solicitação do WebView no Android”

    Há dois problemas com o código de você

    1. Detecção de extensão incorreta

    Por exemplo, quando o código tenta obter extensão de recurso paira este URL:

     https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=12&ct=1442476202&rview=6.4.6456.0&wp=MBI_SSL_SHARED&wreply=https:%2F%2Fmail.live.com%2Fdefault.aspx%3Frru%3Dinbox&lc=1033&id=64855&mkt=en-us&cbcxt=mai 

    Ele retornairá aspx%3Frru%3Dinbox&lc=1033&id=64855&mkt=en-us&cbcxt=mai que está errado. Existe um método especial paira obter a extensão do URL: getFileExtensionFromUrl ()

    1. De acordo com o método de documentation MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext) pode retornair null . Nesse caso, seu código define o tipo mime errado paira a página.

    Aqui está o código do método que leva em consideração esses dois problemas

     @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { String ext = MimeTypeMap.getFileExtensionFromUrl(url); String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); if (mime == null) { return super.shouldInterceptRequest(view, url); } else { HttpURLConnection conn = (HttpURLConnection) new URL( url).openConnection(); conn.setRequestProperty("User-Agent", userAgent); return new WebResourceResponse(mime, "UTF-8", conn.getInputStream()); } } } @Oviewride public WebResourceResponse shouldInterceptRequest(WebView view, String url) { String ext = MimeTypeMap.getFileExtensionFromUrl(url); String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext); if (mime == null) { return super.shouldInterceptRequest(view, url); } else { HttpURLConnection conn = (HttpURLConnection) new URL( url).openConnection(); conn.setRequestProperty("User-Agent", userAgent); return new WebResourceResponse(mime, "UTF-8", conn.getInputStream()); } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.