WebView加载网页加载资源总结MD
作者:单纯只是一2502904797 | 来源:互联网 | 2023-08-08 17:29
Markdown版本笔记我的GitHub首页我的博客我的微信我的邮箱
Markdown版本笔记 |
我的GitHub首页 |
我的博客 |
我的微信 |
我的邮箱 |
MyAndroidBlogs |
baiqiantao |
baiqiantao |
bqt20094 |
baiqiantao@sina.com |
WebView 加载网页 加载资源 总结 MD
目录
目录
WebView 加载数据的几种方法
loadData
使用说明
加载中文注意事项
loadDataWithBaseURL
使用说明
baseUrl的用法解析
loadUrl
postUrl
evaluateJavascript
加载各种类型的资源方法总结
一个完整的案例
Java 代码
参考HTML代码
WebView 加载数据的几种方法
demo
loadData
使用 loadUrl 不但浪费流量,而且加载起来也慢,所以可以将页面提前写好放到项目中,这样就可以用 loadData 更快的加载页面,用户体验会好些。
void loadData(String data, String mimeType, String encoding)
- String data : a String of data in the given encoding
- String mimeType : the MIME type of the data, e.g. 'text/html'
- String encoding : the encoding of the data
使用说明
Loads the given data into this WebView using a 'data' scheme URL.
使用 'data' 方案 URL 将给定的数据加载到此WebView中。
Note that Javascript's same origin policy means that script running in a page loaded using this method will be unable to access content loaded using any scheme other than 'data', including 'http(s)'.
请注意,Javascript的"同源策略"意味着,在使用此方法加载的页面中运行的脚本,将无法访问使用除了使用 data方案 之外的任何内容,包括http。
To avoid this restriction, use loadDataWithBaseURL() with an appropriate base URL.
为避免此限制,请使用带有适当的base URL的loadDataWithBaseURL()方法。
The encoding parameter specifies whether the data is base64 or URL encoded. If the data is base64 encoded, the value of the encoding parameter must be 'base64'.
encoding参数用于指定数据是否是采用base64编码或URL编码。如果数据为base64编码,则编码参数的值必须为'base64'。
For all other values of the parameter, including null, it is assumed that the data uses ASCII encoding for octets inside the range of safe URL characters and use the standard %xx hex encoding of URLs for octets outside that range.
对于此参数的其他所有可能值,包括null,假定数据在安全URL字符范围内使用八位字节的ASCII编码,并且,在此范围以外的字节使用标准的 %xx 十六进制编码的八位字节的URL。
For example, '#', '%', '\', '?' should be replaced by %23, %25, %27, %3f respectively.
例如, '#', '%', '\', '?'应分别由%23,%25,%27,%3f代替。
The 'data' scheme URL formed by this method uses the default US-ASCII charset.
由此方法形成的'data' 方案 URL使用默认的US-ASCII字符集。
If you need to set a different charset, you should form a 'data' scheme URL which explicitly specifies a charset parameter in the mediatype portion of the URL and call loadUrl(String) instead.
如果需要设置不同的字符集,则应该形成一个'data' 方案 URL,它 显式 地在URL的 mediatype 部分 指定 一个charset 参数,或者也可以通过调用loadUrl代替。
Note that the charset obtained from the mediatype portion of a data URL always overrides that specified in the HTML or XML document itself.
请注意,从数据URL的 mediatype部分 获取的字符集,总是覆盖HTML或XML文档本身指定的字符集。
加载中文注意事项
在使用 loadData 方法时,如果按照官网文档样式去写,当出现中文时中文部分会出现乱码,即使指定“utf-8”、“gbk”、“gb2312”也都一样。
String time = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss SSS", Locale.getDefault()).format(new Date());
String data = "你好:包青天 请登录" + "" + time;
错误方式一:
webview.loadData(data, "text/html", "UTF8");
如果baseUrl没有指定,那么这两张图片将显示不出来,因为这里两个图片的地址是相对路径,不指定baseUrl时根本找不到这两张图片。
loadUrl
void loadUrl(String url) Loads the given URL.
void loadUrl(String url, Map additionalHttpHeaders) Loads the given URL with the specified additional HTTP headers.
Map: the additional headers to be used in the HTTP request for this URL, specified as a map from name to value.
要在此URL的HTTP请求中使用的附加的headers,指定为从name到value的映射。
Note that if this map contains any of the headers that are set by default by this WebView, such as those controlling caching, accept types or the User-Agent, their values may be overridden by this WebView's defaults.
请注意,如果此映射包含此WebView默认设置的任何headers,例如控制缓存,可接受的类型,或User-Agent,那么这些设定的值可能会被该WebView的默认值所覆盖。
postUrl
void postUrl (String url, byte[] postData)
- String url : the URL of the resource to load
- byte[] postData : the data will be passed to "POST" request, which must be be "application/x-www-form-urlencoded" encoded.
Loads the URL with postData using "POST" method into this WebView.
If url is not a network URL, it will be loaded with loadUrl(String) instead, ignoring the postData param.
String url = "http://tapi.95xiu.com/app/pay/weixinmiao/user_pay.php" ;
String postData= "uid=" + uid + "&session_id=" + session_id + "&total_fee="+total_fee;
webview.postUrl(url , EncodingUtils.getBytes(postData, "base64"));
evaluateJavascript
void evaluateJavascript (String script, ValueCallback resultCallback)
Asynchronously evaluates Javascript in the context of the currently displayed page. If non-null, |resultCallback| will be invoked with any result returned from that execution. This method must be called on the UI thread and the callback will be made on the UI thread.
在当前显示页面的上下文中异步执行Javascript。 如果非空,| resultCallback | 将使用从该执行返回的任何结果来调用它。 必须在UI线程上调用此方法,并在UI线程上进行回调。
加载各种类型的资源方法总结
加载assets下的资源
webView.loadUrl("file:///android_asset/" + "h5/test.html");
或
String data = "包青天" + "" + time;
webView.loadDataWithBaseURL("file:///android_asset/", data, "text/html", "utf-8", null);
加载 res/drawable 或 res/mipmap 或 res/raw 下的资源
webView.loadUrl("file:///android_res/" + "drawable/ic_launcher");
webView.loadUrl("file:///android_res/" + "mipmap/ic_launcher");
webView.loadUrl("file:///android_res/" + "raw/test");
或
data = "包青天" + "" + time;
webView.loadDataWithBaseURL("file:///android_res/", data, "text/html", "utf-8", null);
加载SD卡中的资源
String FILE_BASE_SIMPLE = "file://" + Environment.getExternalStorageDirectory().getAbsolutePath()+ "/";//【file:///sdcard/】
webView.loadUrl(FILE_BASE_SIMPLE + "test.html");//【file:///storage/emulated/0/test.html】或【file:///sdcard/test.html】
或
data = "包青天" + "" + time;
webView.loadDataWithBaseURL(FILE_BASE_SIMPLE, data, "text/html", "utf-8", null);
一个完整的案例
演示load不同资源的方法
Java 代码
public class LoadUrl_DataActivity extends ListActivity {
private WebView webView;
private boolean b;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] array = {"0、loadData时中文乱码问题,错误解决方案",
"1、loadData时中文乱码问题,正确解决方案",
"2、演示loadDataWithBaseURL方法中,参数baseUrl的作用",
"3、加载assets下的资源",
"4、加载res/drawable下的资源",
"5、加载res/raw下的资源",
"6、加载SD卡中的资源",
"7、加载网页http资源",};
setListAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new ArrayList<>(Arrays.asList(array))));
webView = new WebView(this);
getListView().addFooterView(webView);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
String time = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss SSS", Locale.getDefault()).format(new Date());
String data = "包青天百度" + "" + time;
b = !b;
Toast.makeText(this, "" + b, Toast.LENGTH_SHORT).show();
switch (position) {
case 0://loadData时中文乱码问题,错误解决方案
String encoding = b ? "UTF8" : "base64";//encoding参数的值,设置为null或其他任何值(除了"base64")都是没有影响的
webView.loadData(data, "text/html", encoding);//如果不是采用的base64编码,那么绝对不可以设置为base64
break;
case 1://loadData时中文乱码问题,正确解决方案
if (b) webView.loadData(data, "text/html; charset=UTF-8", "encoding可以是base64之外的任何内容");
else webView.loadDataWithBaseURL(null, data, "text/html", "utf-8", null);
break;
case 2://演示loadDataWithBaseURL方法中,参数baseUrl的作用
String baseUrl = b ? null : "http://img.mmjpg.com";//不设置baseUrl时,data2里面的两张图片将显示不出来
String data2 = "这里两个图片的地址是相对路径";
webView.loadDataWithBaseURL(baseUrl, data2, "text/html", "utf-8", null);
break;
case 3://加载assets下的资源
data = "包青天" + "" + time;
if (b) webView.loadUrl(URLUtils.ASSET_BASE + "h5/test.html");
else webView.loadDataWithBaseURL(URLUtils.ASSET_BASE, data, "text/html", "utf-8", null);
break;
case 4://加载res/drawable 或 res/mipmap下的资源。不会区分drawable与drawable-***,但会区分drawable和mipmap
data = "包青天" + "" + time;
if (b) webView.loadUrl(URLUtils.RESOURCE_BASE + "mipmap/ic_launcher");//建议直接省略文件后缀名
else webView.loadDataWithBaseURL(URLUtils.RESOURCE_BASE, data, "text/html", "utf-8", null);
break;
case 5://加载res/raw下的资源,和res/drawable一样,都属于Resources资源文件
data = "包青天" + "" + time;
if (b) webView.loadUrl(URLUtils.RESOURCE_BASE + "raw/test");
else webView.loadDataWithBaseURL(URLUtils.RESOURCE_BASE, data, "text/html", "utf-8", null);
break;
case 6://加载SD卡中的资源。注意,如果提示【net::ERR_ACCESS_DENIED】,是因为没有申请权限
data = "包青天" + "" + time;
if (b) webView.loadUrl(URLUtils.FILE_BASE_SIMPLE + "test.html");
else webView.loadDataWithBaseURL(URLUtils.FILE_BASE_SIMPLE, data, "text/html", "utf-8", null);
break;
case 7://加载网页http资源
webView.loadUrl(b ? "http://www.meituba.com/" : "http://img.mmjpg.com/2017/936/5.jpg");
break;
}
}
}
参考HTML代码
加载资源
res下的图片 src='file:///android_res/drawable/ic_launcher'
assets下的图片 src='file:///android_asset/icon.jpg'
SD卡下的图片 src='file:///sdcard/icon.png'
电话
短信
邮件
2017-7-27