webview html页面加载本地js及img src(一)

webview html页面加载本地js及img src(二)

这个标题可能没表达清楚我要说什么。

本人不太懂android,最近开始做android的项目,需要解决一些技术问题,所以把一些Demo级的东西写下来,记录一下。

我们的客户端软件主要部分用webview的表现形式来实现。当然这个东东有优点、缺点也不少。

今天,我们要解决的就是,如何从节省流量的角度来优化加载速度。

web页面部分,我们可能要用到jquery,但是jquery.js那个文件不小,所以我打算把它放在手机本地。

当然类似地,比较常用的img图片也可以这样做。关键是在整体上要有一个标准,并不是为了用这个技术而去做一些没意义的工作。


查了一些资料,直接用

<script type="text/javascript" charset="utf-8" src="url('file:///sdcard/js/jquery.js')"></script>

<script type="text/javascript" charset="utf-8" src="url('file:///android_asset/js/jquery.js')"></script>

是不行的。可能的原因是html页面读取客户端本地的资源,这涉及权限、安全性方面的问题,所以以file:///的形式默认是不行的。如果谁认为这样可行,并且知道怎么搞请和大家分享一下


最终我找到的方法是:用ContentProvider来读取文件。下面的代码示例来自于http://android-phpmanual.googlecode.com/svn

//LocalFileContentProvider.java

package lu.mind.androidphpmanual;

import java.io.File;
import java.io.FileNotFoundException;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;

public class LocalFileContentProvider extends ContentProvider {
	private static final String URI_PREFIX = "content://lu.mind.androidphpmanual";

	public static String constructUri(String url) {
		Uri uri = Uri.parse(url);
		return uri.isAbsolute() ? url : URI_PREFIX + url;
	}

	@Override
	public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
		File file = new File(uri.getPath());
		ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
		return parcel;
	}

	@Override
	public boolean onCreate() {
		return true;
	}

	@Override
	public int delete(Uri uri, String s, String[] as) {
		throw new UnsupportedOperationException("Not supported by this provider");
	}

	@Override
	public String getType(Uri uri) {
		throw new UnsupportedOperationException("Not supported by this provider");
	}

	@Override
	public Uri insert(Uri uri, ContentValues contentvalues) {
		throw new UnsupportedOperationException("Not supported by this provider");
	}

	@Override
	public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
		throw new UnsupportedOperationException("Not supported by this provider");
	}

	@Override
	public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
		throw new UnsupportedOperationException("Not supported by this provider");
	}

}

//html,并提前把js/jquery.js和img/016p.gif两个文件放在手机的sd卡里。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0" />
<title>Insert title here</title>
<script type="text/javascript" charset="utf-8" src="content://lu.mind.androidphpmanual/sdcard/js/jquery.js"></script>

</head>
<body>b这是一个html页面
<hr />
<hr />
<button οnclick="showNote('andy')">showNote</button>
<img src="content://lu.mind.androidphpmanual/sdcard/img/016p.gif" alt="本地图片">
</body>


</html>


s



本来想通过assets的形式读取的。可是也失败了。请高人指点!下面是我的代码:

//	@Override
//	public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
//	    try {
//	    	String path = uri.getPath();
//	        return getContext().getAssets().openFd(path.substring(1)).getParcelFileDescriptor();
//	    } catch (IOException e) {
//	        throw new FileNotFoundException();
//	    }
//	}



s

Content Provider 基础 之URI[转]

Content Provider这个东西在Android平台上是最常用的共享数据的方法(似乎应用程序之间共享数据也只有这种方法吧,待求证)。虽然常用,但是这个东 西要理解透彻还是要先掌握一些基础的。URI就是Content Provider(简称CP)的基础。我们要标识一个CP,就必须用URI这个东东。这就类似于我们要通过网址来标识某个特定网站,实际上网址URL本身 就是一种URI。URI全称Uniform Resource Identifier, 它包括了URL和URN。而关于它们的详细解释,有心的朋友可以参考RFC3896:http://tools.ietf.org/html /rfc3986。URI不仅可以标识特定CP,还可以标识CP中特定的数据库表,就好像URL不仅可以标识特定网站,也可以标识这个网站某个特定网页一 样。实际上在Android平台上URI的用途更广泛一些,它还用于Intent中data的标识。
就Android平台而言,URI主要分三个部分:scheme, authority and path。其中authority又分为host和port。格式如下: 
scheme://host:port/path
举个实际的例子:
content://com.example.project:200/folder/subfolder/etc
\---------/  \---------------------------/ \---/ \--------------------------/
scheme                 host               port        path
                \--------------------------------/
                          authority    

现在大家应该知道data flag中那些属性的含义了吧,看下data flag
<data android:host="string"
      android:mimeType="string"
      android:path="string"
      android:pathPattern="string"
      android:pathPrefix="string"
      android:port="string"
      android:scheme="string" />
但是我们在程序中一般是不直接用URI来标识CP的,是的,正如我们通常见到的用定义的常量来标识。例如standard CP中的Contacts,我们就用Contacts.People.CONTENT_URI来标识Contacts CP中People这个表。那么要标识某个具体的人怎么办呢? 这就用到了ContentUris.withAppendedId() 和 Uri.withAppendedPath()。例如我们要表示content://contacts/people/20,那么我们就可以用如下语句:
Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, 20); 或者
Uri uri = Uri.withAppendedPath(People.CONTENT_URI, "20");

好了现在我们应该理解URI是怎么回事了,后续我再写CP其它方面的基础。


转自http://notfatboy.iteye.com/blog/582834


sss


s

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要替换网页内的图片,你需要在 AndroidWebView 中使用 WebViewClient 的 onPageFinished() 方法来实现。具体步骤如下: 1. 创建一个类继承自 WebViewClient,并重写其中的 onPageFinished() 方法。 2. 在 onPageFinished() 方法中,获取 WebView 中的 HTML 内容,然后使用正则表达式来匹配网页中的图片标签。 3. 对于每个匹配到的图片标签,使用 Android 的本地文件系统读取对应的本地图片文件,然后将其转换为 Base64 编码的字符串。 4. 使用 JavaScript 来替换网页中的图片标签,将其替换为包含 Base64 编码字符串的 data URI。 下面是示例代码: ```java public class MyWebViewClient extends WebViewClient { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); String javascript = "javascript:(function() {" + "var imgs = document.getElementsByTagName('img');" + "for (var i = 0; i < imgs.length; i++) {" + "var img = imgs[i];" + "var url = img.src;" + "if (url.startsWith('http')) {" + "var xhr = new XMLHttpRequest();" + "xhr.open('GET', url, true);" + "xhr.responseType = 'arraybuffer';" + "xhr.onload = function() {" + "if (xhr.status === 200) {" + "var uInt8Array = new Uint8Array(xhr.response);" + "var i = uInt8Array.length;" + "var binaryString = new Array(i);" + "while (i--) {" + "binaryString[i] = String.fromCharCode(uInt8Array[i]);" + "}" + "var data = binaryString.join('');" + "var base64 = window.btoa(data);" + "img.src = 'data:image/png;base64,' + base64;" + "}" + "};" + "xhr.send();" + "}" + "}" + "})()"; view.loadUrl(javascript); } } ``` 这段代码会在 WebView 加载网页完成后,使用 JavaScript 来替换所有 HTTP 开头的图片链接为对应的 Base64 编码字符串。你需要将图片的本地路径替换为对应的路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值