2016-06-24 6 views
1

WebViewにリモート画像を表示させようとしています(特定のスタイル上の調整が必要です)。これは、他のものの中でそのリモートIMGを参照するHTMLスニペットをWebViewにロードすることで完璧に動作します。しかし唯一の問題は、時にはこのリモートイメージが存在せず、イメージアイコンが壊れてしまうことです。Android WebView:1つの要素(ページ全体ではない)の傍受エラー404

私がしたいのは、リモートイメージの可用性を傍受し、別のイメージに切り替えることでリカバリすることです。私はonReceivedError()WebViewClientを使用しようとしましたが、イメージが利用できない場合でも何とかトリガーしません。次のように

私の現在の画像の読み込みロジックは次のとおりです。

String url = "...";  // remote image URL 
String html = String.format("<style>img{display: inline;" + 
          "height: auto;max-width: 100%%;}</style>" + 
          "<img src=\"%s\"></img>", url); 

wv.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onReceivedError(WebView view, WebResourceRequest req, 
           WebResourceError rerr) { 
     Log.e("WEB_VIEW_TEST", "error code: " + errorCode); 
    } 
}); 

wv.loadData(html, "text/html", null); 

私はonReceivedError()だけでページレベルのエラーをトリガし、私はそれが要素レベルのエラーをトリガするようにする方法をわからないと思います。どんな助けでも大歓迎です。

PS。これを入力している間、私はJSで扱うことを考えました。つまり、リモートのイメージをロードしようとするJSスニペットを使ってwebviewをロードし、エラーが発生した場合にJavaScriptの領域内に別のものをロードします。私はそれを試してみましょう、それがうまくいけば、ここにも投稿します。

答えて

0

Androidソリューションのインターセプトについての質問は依然として残っていますが、JavaScriptソリューションが正常に機能します。 JavaScriptの方法は次のとおりです。

String url = "...";   // real image 
    String backup_url = "..."; // backup image 

    WebView wv = (WebView) findViewById(R.id.fullImageWebView); 
    WebSettings webSettings = wv.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 

    // FIXME: put into assets as an HTML file 
    String template = "" + 
      "<style>\n" + 
      " img {\n" + 
      "  display: inline;\n" + 
      "  height: auto;\n" + 
      "  max-width: 100%%;\n" + 
      " }\n" + 
      "</style>\n" + 
      "\n" + 
      "<img id='image'></img>\n" + 
      "\n" + 
      "<script>\n" + 
      " var second_attempt = false;\n" + 
      " var img = document.getElementById('image');\n" + 
      " img.src = '%s';\n" + 
      "\n" + 
      " window.addEventListener('error', function(e) {\n" + 
      "  if (!second_attempt) {\n" + 
      "   second_attempt = true;\n" + 
      "   img.src = '%s';\n" + 
      "  }\n" + 
      " }, true);\n" + 
      "</script>"; 


    String html = String.format(template, url, backup_url); 
    wv.loadData(html, "text/html", null); 
関連する問題