我想实现一个允许用户保存的应用程序 网页包括图像。然后用户可以再次查看网页 即使没有网络访问。但是,我发现没有 这样做的相关API。有没有人有想法或经验?任何人都可以给出一些想法或源代码链接吗?
答案 0 :(得分:7)
至少对于基本页面,这应该是可能的。
(1)下载HTML文件,而不是直接将其加载到WebView中。然后使用WebView.loadData()或WebView.loadDataWithBaseUrl()将页面加载到视图中。不要删除html,稍后你会需要它。
(2)设置自己的WebViewClient,它覆盖[至少] onLoadResource()。然后保存页面请求的每个资源。
(3)现在您已经存储了HTML,以及文件系统上的所有必要文件。在HTML中搜索绝对路径,您需要使用替换函数更新它们,因此它们是相对路径(并且将在文件系统上工作)或保存images / css / etc的绝对路径。 (在文件系统上)
(4)将html写入文件系统。
我希望这会有所帮助。
或者,您可以将页面保存为图像,基本上可以截取WebView的屏幕截图。这不允许复制/粘贴或点击链接,但如果您只需要“稍后再查看”,这将更加简单。
答案 1 :(得分:1)
您可以使用saveWebArchive
。如果您还想保存通过url等页面引用的资源,则需要覆盖onLoadResource()
。
static WebView getWebView(Activity activity, int id, String url) {
WebView w1 = activity.findViewById(id);
WebSettings wSettings = w1.getSettings();
wSettings.setJavaScriptEnabled(true);
wSettings.setAllowFileAccess(true);
wSettings.setAppCacheEnabled(true);
wSettings.setAppCachePath(activity.getBaseContext().getCacheDir().getAbsolutePath());
wSettings.setJavaScriptCanOpenWindowsAutomatically(true);
wSettings.setSavePassword(true);
wSettings.setSaveFormData(true);
wSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
wSettings.setUserAgentString("Android");
w1.setWebViewClient(new WebViewClient() {
boolean err;
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
view.setVisibility(View.GONE);
err = true;
}
public void onPageFinished(WebView view, String url) {
// super.onPageFinished(view, url);
if (!err) {
if (!url.endsWith(".mht")) {
File f = getFileFromUrl(url);
view.saveWebArchive(f.getAbsolutePath());
}
view.setVisibility(VISIBLE);
}
}
@Override
public void onLoadResource(WebView view, String url) {
File f = getFileFromUrl(url);
if(f.exists()) url = "file:///" + f.getAbsolutePath();
else {
new Thread(()->{
}).start();
}
super.onLoadResource(view, url);
}
});
w1.setWebChromeClient(new WebChromeClient());
File f = getFileFromUrl(url);
if (f.exists() && f.lastModified() > new Date().getTime() - 5 * 24 * 3600000) w1.loadUrl("file:///" + f.getAbsolutePath());
else w1.loadUrl(url);
return w1;
}
答案 2 :(得分:0)
添加另一种答案,因为方法根本不同。
仅当您可以控制要连接的网站时,此答案才适用。
您可以按照this post中的说明使用应用程序缓存。
按如下所示修改代码
<html manifest="./cache-manifest.appcache">
...
</html>
和清单文件应类似于以下内容
CACHE MANIFEST
index.html
stylesheet.css
images/logo.png
scripts/main.js
http://cdn.example.com/scripts/main.js
有关更多信息,请阅读帖子-https://medium.com/javascript-in-plain-english/offline-accessible-web-pages-using-the-application-cache-408a4c19f4c2