2013-04-10 1 views
2

Я работаю над проектом, в котором мы заинтересованы в перехвате некоторого HTTP-трафика из WebView, затем добавим некоторые дополнительные заголовки к запросам, а затем вернемся назад и отобразим его в WebView.Webview показывает только текст HTML на некоторых страницах

Для этого мы используем метод shouldInterceptRequest (WebView view, String URL), который возвращает WebResourceResponse, который должен отображать веб-просмотр.

Вот что я делаю:

private WebResourceResponse handleRequest(String url){ 
    Log.d(TAG, "Intercepting request at : " + url); 
    HttpURLConnection connection = null;   
    URL serverAddress = null;   
    WebResourceResponse response = null; 
    InputStream is = null; 
    String type = null; 
    String encoding = null; 
    int statusCode; 
    int length; 

    try 
    { 
     //Set up the initial connection 
     serverAddress = new URL(url); 
     connection = (HttpURLConnection)serverAddress.openConnection(); 

     // Initiate a HEAD request to get meta data 
     connection.setRequestMethod("HEAD"); 

     // Let the WebView handle requests with no headers in them. 
     Map<String, List<String>> headers = connection.getHeaderFields(); 
     if(headers == null){ 
      Log.d(TAG, "Retrieved response with zero headers at: " + url); 
      return null; 
     } 

     statusCode = connection.getResponseCode(); 

     if(statusCode == 200){ 
      // OK, delegate request if content length is large enough 
      type = connection.getContentType(); 
      encoding = connection.getContentEncoding(); 
      length = connection.getContentLength(); 

      Log.d(TAG, "ContentType = " + type + " encoding = " + encoding + " " + url); 

      connection.disconnect(); 

      if(length > SIZE_THRESHOLD){ 
       // send to other device 

       Log.d(TAG, "Delegating request to other device NOT IMPLEMENTED"); 
       // TODO: Currently just handling them locally. 
      } 
      else{ 
       connection = (HttpURLConnection)serverAddress.openConnection(); 
       connection.setRequestMethod("GET");    
       is = connection.getInputStream(); 
       statusCode = connection.getResponseCode(); 
       type = connection.getContentType(); 
       encoding = connection.getContentEncoding(); 

       Log.d(TAG, "Done Loading " + url); 

       return new WebResourceResponse(type, encoding, is); 
      } 

     } 
    } 
    catch (MalformedURLException e) { 
      e.printStackTrace(); 
    } 
    catch (ProtocolException e) { 
      e.printStackTrace(); 
    } 
    catch (IOException e) { 
     Log.d(TAG, "IOException when connection to : " + url + " Stacktrace: " + Log.getStackTraceString(e)); 
    } 
    return response; 
} 

При попытке загрузить страницу как «www.madopskrifter.nu» или «www.newz.dk», то я получаю все содержимое просто отлично с фотографиями и все. Однако, если я просматриваю страницы, такие как stackoverflow, я просто получаю индексный файл HTML на stackoverflow.com. То же самое для youtube.com. (У меня включен JavaScript в настройках WebView)

Есть что-то, что мне не хватает? на данный момент я даже не добавляю свои собственные заголовки или что-то еще, я просто возвращаю тот же ответ, за исключением того, что я получаю их «вручную». (Также я не обрабатываю запросы с нулевыми заголовками прямо сейчас, но даже если я прокомментирую этот код, тогда проблема все еще существует).

Любая помощь будет принята с благодарностью,

ответ

11

Я нашел решение этой же задачи у меня был, YMMV:

Мой HttpURLConnection возвращался:

  • кодирование: нулевой
  • mimeType: "text/html; charset = utf-8"

Tha Это была проблема.

теперь проверить HTML-файлов, а также изменить на:

  • кодирования: "UTF-8"
  • MIMETYPE: "текст/html"

Пример:

String responseEncoding = urlConnection.getContentEncoding(); 
String responseMimeType = urlConnection.getContentType(); 

String html = ""; 
if (resourceUrl.endsWith("html")) 
{ 
    responseEncoding = "UTF-8"; 
    responseMimeType = "text/html"; 
} 

if((responseCode == 200) && (!is.equals(""))) 
{ 
    return new WebResourceResponse(responseMimeType, responseEncoding, returnStream); 
} else 
{ 
    return null; 
} 
+0

Спасибо, что спас мой день! – mivola

 Смежные вопросы

  • Нет связанных вопросов^_^