打开本地html文件的方法
有些html文件放在本地磁盘和sdcard,如何用打开这个网页呢?
这种应用在测试时非常有用。
有2个方法:
1. 使用文件管理器
如ES等,需要幸运的是你的文件管理器直接用浏览器打开。
2. 在浏览器输入地址
访问本地磁盘和SD卡上的HTML,前部分content://com.android.htmlfileprovider是Provider的标准,后面是程序目录。
比如sdcard的tesl.html
直接在浏览器里输入content://com.android.htmlfileprovider/sdcard/test.html回车就可以看到网页了。
在代码
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html")
如果是其它程序的私有html文件,这样做会失败。
这是由于com.android.htmlfileprovider的权限不够,如果是重写一个私有的HtmlProvider位于同一个应用中,应该能解决问题。然后就参考了原来的com.android.htmlfileprovider
源代码,改写了下。问题解决了,使用私有的HTMLProvider,可以轻松的访问手机内存中,程序私有目录下的html文件。
网上有例子,你可以搜索!
html页面(命名:Android.html放在assets文件夹下):::::<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "
<html xmlns="">
<head>
<meta http-equiv="Content-Type" content="text/html charset=utf-8" />
<script language="javascript" type="text/javascript">
function get4Android(str){
document.getElementById("show").innerHTML="This is a message from android:"+str
}
</script>
</head>
<body>
<div id="show"></div>
</body>
</html>
Text.java代码:::
import android.app.Activity
import android.os.Bundle
import android.os.Handler
import android.os.Message
import android.text.Editable
import android.view.MotionEvent
import android.view.View
import android.view.View.OnClickListener
import android.view.View.OnTouchListener
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
public class Text extends Activity implements OnClickListener {
private Button button
private TextView text
private WebView web
private EditText edit
private Handler handler
private void initView() {
button = (Button) this.findViewById(R.id.button2)
web = (WebView) this.findViewById(R.id.webView1)
edit = (EditText) this.findViewById(R.id.editText1)
button.setOnClickListener(this)
}
private void setWebView() {
web.setWebViewClient(new WebViewClient())
web.requestFocus()
WebSettings setting = web.getSettings()
setting.setJavaScriptEnabled(true)
web.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
web.requestFocus()
return false
}
})
web.addJavascriptInterface(new SendAndroid(), "theKey")
web.loadUrl("file:///android_asset/android.html")
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
initView()
setWebView()
handler = new Handler() {
public void handleMessage(android.os.Message msg) {
String str = msg.obj.toString()
text.setText(str)
}
}
}
@Override
public void onClick(View v) {
Editable editable = edit.getText()
web.loadUrl("javascript:get4Android(\"" + editable.toString()
+ "\")")
}
class SendAndroid {
public void runOnAndroidJavaScript(final String str) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("******" + str)
Message mes = handler.obtainMessage()
mes.obj = str
handler.sendMessage(mes)
}
}).start()
}
}
}
主要是:web.loadUrl("javascript:get4Android(\"" + editable.toString()+ "\")")中的“javascript:get4Android”要和html中的【function get4Android(str){
document.getElementById("show").innerHTML="This is a message from android:"+str
}】方法名相同
首先,Android中显示Html内容,有3中方式:(目前我用到的有这3种)1、可以利用Android原生的Html.fromHtml(str, imageGetter, tagHandler)来进行显示。(不过,我这边用了,即使加了页面加载动画,还是觉得非常慢,有大量图片,会导致OOM;如果图片不多的话,可以考虑)
2、利用第三方插件HtmlTextView。
GitHub地址:https://github.com/PrivacyApps/html-textview
图片加载很顺畅,使用方法也非常简单,不过,有两个注意事项:
(1)其中,HtmlHttpImageGetter有3个构造函数,可以根据自己的情况选择。
(2)加载大量图片的时候,会导致OOM内存溢出。针对于这个情况,HtmlHttpImageGetter有一个压缩图片的方法可以调用,可以进去查看它的公共方法。(不过,我这边显示的图片过大,每张1M左右,并且一下子有几十张,即使设置了压缩图片,还是会导致OOM问题,目前还没解决,有大神知道咋弄的,拜托指点一下,非常感谢!)
对了,这个第三方插件的基本用法,点击上面的连接,进去一看就知道了,很简单。
3、第三种,是我没办法的情况下想的:把html标签里的内容利用正则表达式拿出来,其中,文本内容用一个TextView代替,<img>标签图片用一个ImageView代替,其他相关的标签自行选择替换。说白了,就是创建一个个的TextView以及ImageView填充到布局里(LinearLayout之类的)。要说明的是:其中图片显示用Glide来实现。目前我这边测试的情况还是可以的,加载的速度非常快,也没因内存问题导致APP崩溃。