1 String newHtml = html + 2 "<script type=\"text/javascript\">" + 3 "(function (){"+ 4 "var imageList = document.getElementsByTagName(\"img\");"+ 5 "for(var i=0; i<imageList.length; i++){"+ 6 "var image = imageList[i];"+ 7 "image.href = image.src;"+ 8 "image.src = \"content://com.example.demo/res/def.jpg\";"+ 9 "image.alt = \"点击加载图片\";"+ 10 "image.onclick = function(){"+ 11 "this.src = this.href;" + 12 "return false;"+ 13 "}"+ 14 "}"+ 15 "}());"+ 16 "</script>";17 mWebView.getSettings().setJavaScriptEnabled(true);18 mWebView.loadData(newHtml, "text/html; charset=UTF-8", null);
以上的代码是在获取到的html页面后面添加一个自动执行的js函数,把所有图片标签的地址替换为一个占位图,当图片被点击时再加载真实的图片。要加载应用自带的图片,我们可以用ContentProvider来实现。在com.example.demo.provider包目录下创建一个ContentProvider,重写openAssetFile方法来获取Assets文件夹里的占位图,然后在AndroidManifest.xml里注册ContentProvider。
1 @Override 2 public AssetFileDescriptor openAssetFile(Uri uri, String mode) 3 throws FileNotFoundException { 4 String fileName = uri.getLastPathSegment(); 5 try { 6 return getContext().getAssets().openFd(fileName); 7 } catch (IOException e) { 8 e.printStackTrace(); 9 return super.openAssetFile(uri, mode); 10 } 11 }
1 <provider 2 android:name="com.example.demo.database.ImageContentProvider" 3 android:authorities="com.example.demo" />
但是这个方法只能用在Android4.4以下的版本,4.4以后的版本换了WebView的内核后这个办法就无效了。所以我们可以用WebViewClient中一个API11开始提供的一个接口shouldInterceptRequest来实现拦截。
1 public WebResourceResponse shouldInterceptRequest(WebView view, 2 String url) { 3 WebResourceResponse response = null; 4 if (url.contains("def.jpg")) { 5 try { 6 InputStream image = getAssets().open("def.jpg"); 7 response = new WebResourceResponse("image/jpeg", "UTF-8", image); 8 } catch (IOException e) { 9 e.printStackTrace(); 10 } 11 } 12 return response; 13 }
最省事的话就是随便找个云储存,自己上传一张图片到上面。然后用这张图片的URL作为占位图,反正WebView会自动缓存数据,所以这张图片只会读取一次。
时间: 2024-12-10 01:27:29