保存webview内容以进行离线浏览?

时间:2012-01-09 07:10:00

标签: android image web

我想实现一个允许用户保存的应用程序   网页包括图像。然后用户可以再次查看网页    即使没有网络访问。但是,我发现没有    这样做的相关API。有没有人有想法或经验?任何人都可以给出一些想法或源代码链接吗?

3 个答案:

答案 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