【Android】WebView读取本地图片

背景

咱的博客园APP,是通过一个WebView来展示新闻的详情的。新闻必然是图文并茂的,无论是支持离线缓存还是加速新闻的打开速度, 都需要咱们打通本地存储与WebView之间的桥梁。

思路

1:首先把WebView的绝对路径设置为我们图片存储的根目录

修改第一个参数以指向本地存储目录,这样就可以使用相对路径引用该目录下的本地文件了。如

webView.loadDataWithBaseURL("file:///storage/emulated/0/Android/data/zhexian.learn.cnblogs/files/zCache/", htmlContent, "text/html", "utf-8", null);

2:把图片资源存储到本地

针对博客园新闻实体,dudu老大贴心提供了ImageUrl字段,把该新闻用到的图片地址用分号隔离,拼接成一个字符串,参考例子

这种数据源我们处理起来自然是轻松加愉快了。

但是如果没有这个数据源的话,我们也可以使用正则表达式,遍历新闻内容的img标签进行处理。

咱本地存储规则是这样的,砍掉第三个/号之前的内容,将/转换成_号存储在缓存文件夹。

比如http://images2015.cnblogs.com/news/66372/201508/66372-20150826093938187-2008871077.jpg

处理后就是news_66372_201508_66372-20150826093938187-2008871077.jpg文件

3:遍历img标签,把src指向本地文件

标签的正则表达式如下

Pattern patternImgSrc = Pattern.compile("<img(.+?)src=\"(.+?)\"(.+?)/>");

在正则遍历的循环里,我们判断当前匹配到的src路径,本地是否存在,如果存在,则替换成本地路径,否则是使用占位图还是直接下载,取决于你的wifi无图策略。

4:添加js交互

在新闻的详情页面,用到js交互有两个地方

1:如果用户选择无图省流量模式,此时图片还是用占位图的,用户点击该占位图,可以加载原图替换

2:如果已经加载了图片,用户点击该图片时,可以查看大图

这里的知识涉及到一小部分android与js交互,以及js处理图片标签。

前者网上一大堆,就不细说,后者代码很简短,就贴上来

function showImage (obj,src) {
    if (obj.src.indexOf(‘click_load_day.png‘)<0 && obj.src.indexOf(‘click_load_night.png‘)<0)
        Android.displayImage(src);
    else
        obj.src=src;
}

最后的效果图如下

如:1占位图

2:点击之后使用原图替换掉占位图

3:点击替换后的图片,启动系统原生查看图片程序Activity。

时间有点赶,暂时写到这里,细节请参考站的博客园app,源码地址

时间: 2024-08-26 11:19:59

【Android】WebView读取本地图片的相关文章

Android:WebView中对图片注册上下文菜单

前言 今天一朋友问我一个问题,就是如何在WebView控件中的图片增加上下文菜单,以便增加保存图片等功能.今天就给他简单做了一个演示Demo,现写下来,给有相同问题的朋友提供些许思路吧. 概要实现 其实这个功能很简单,没有太复杂的东西,就是对WebView的控件的使用,一是给WebView注册了上下文菜单事件,二是在响应事件中去判断事件源的类型,如果是图片类型,则把url取出来 注册上下文菜单事件 这个就比较简单了通过下面的代码即可完成. WebView vw = (WebView) findV

读取本地图片写到jsp页面

//读取本地图片写到jsp页面 File file = new File("D:/parking/A区12号.jpg"); ServletOutputStream out = null; InputStream in = null; try { in = new FileInputStream(file); response().setContentType("multipart/form-data"); int tempbyte; out = response()

Anroid5.0下webview显示本地图片

以前的时候,Android下webview显示本机图片可用ontent://+包名+路径的方式来实现,后来5.0后,安全协议提高了,不支持这种方式了,后来发现img标签可以是这样用,将本地图片转换为bitmap,再将bitmap转为Base64 public static String imgToBase64(Bitmap bitmap) { ByteArrayOutputStream out = null; try { out = new ByteArrayOutputStream(); bi

android webView webchromeclient 本地图片资源

解决android webView openFileChooser 不能调用本地文件 其实主要问题是出现在webChromeClient 的身上,通过查看webChromeClient的源代码我我们知道里面有个openFileChooser函数,不过很可惜,这个函数是不公开的,即使我们使用继承也不能使用这个函数.哈哈,那怎么办呢? 我们还是来看看这个函数具体长成啥样吧. 其实它是这样的 /** * Tell the client to open a file chooser. * @param

[转]android端读取本地图片出现OutOfMemoryException

前些日子一直为图片内存溢出问题困扰着,查了N多资料,将google彻底翻遍了都没找到解决方案,就当我几乎绝望的时候意外发现了一位网友的一个工具类,抱着最后一丝希望将代码co过来试了一把,结果令我喜出望外.嘿,解决了!暂不说多么欢喜了,听我慢慢道来这其中的前因后果吧! 需求:下载时候将图片一并down下来,在空间里显示并支持离线观看 第一个版本代码: //从本地读取图片    public Bitmap getBitmapFromSD(String filename) {        FileI

Android之获取本地图片并压缩方法

这两天在做项目时,做到上传图片功能一块时,碰到两个问题,一个是如何获取所选图片的路径,一个是如何压缩图片,在查了一些资料和看了别人写的后总算折腾出来了,在此记录一下. 首先既然要选择图片,我们就先要获取本地所有的图片,Android已经为我们封装好了该意图. 1 Intent intent = new Intent(Intent.ACTION_PICK, null);//从列表中选择某项并返回所有数据 2 intent.setDataAndType( 3 MediaStore.Images.Me

FileReader:读取本地图片文件并显示

最近忙得比狗还惨,导致长时间没能更新文章,真心对不住啊.抽空整理了下关于在页面上读取和显示本地图片的实例文章,本文通过实例讲解如何使用支持FileReader浏览器的用户将能够通过一个file input选择一个图片文件,并不经过上传而直接将图片显示在页面中. 查看演示 要想在页面上显示本地图片,以前我们通常的做法是将选择的图片文件上传至后端服务器,后端对其进行存储,再将图片的URL返回到前端,前端通过这个URL来显示图片.而HTML5的FileReader接口支持本地预览,FileReader

android端读取本地图片出现OutOfMemoryException解决办法

前些日子一直为图片内存溢出问题困扰着,查了N多资料,将google彻底翻遍了都没找到解决方案,就当我几乎绝望的时候意外发现了一位网友的一个工具类,抱着最后一丝希望将代码co过来试了一把,结果令我喜出望外.嘿,解决了!暂不说多么欢喜了,听我慢慢道来这其中的前因后果吧! 需求:下载时候将图片一并down下来,在空间里显示并支持离线观看 第一个版本代码: //从本地读取图片 public Bitmap getBitmapFromSD(String filename) { FileInputStream

Android 如何实现本地图片直接分享到微信、来往、QQ等,直接分享图片到指定应用

例如:要在app中直接分享图片到微信.来往等,而不调用他们的sdk 直接贴代码如下; public void shareImage(Bitmap bitmap) { try { Uri uriToImage = Uri.parse(MediaStore.Images.Media.insertImage( mContext.getContentResolver(), bitmap, null, null)); Intent shareIntent = new Intent(); shareInte