繁体   English   中英

如何将网页另存为网页存档,然后使用Android的WebView将网页存档显示为网页?

[英]How to save webpage as web archive and then display the web archive as a webpage using Android's WebView?

我正在Android Studio 3.0.1,Xubuntu 16.04 LTS中开发一个Android应用程序,使用WebView作为包含HTML,CSS,JavaScript / jQuery并使用PHP / MySQL作为后端的响应式Web应用程序的包装。 几乎所有内容都按预期工作:页面完全呈现,JavaScript运行,并且sign-up / login / news-feed系统按预期工作。

但是,现在我想实现某种简单的缓存系统,以便在没有Internet连接时用户仍可以看到页面的最新可用版本。

截至目前,我已经设法检测是否存在Internet连接。 如果没有连接,WebView将显示一个本地“错误”页面,该页面存储在应用程序文件中-比默认的Android“连接错误”屏幕要好,但用户仍然无法从该页面看到图像和文本。离线时的动态消息,例如在Facebook应用中。

我尝试过的方法(Java / Android Studio):

当用户打开应用程序(onCreate)时

  • 如果没有连接,请检查要检索的页面的本地保存版本。 如果存在连接,则下次将页面另存为.mht文件:

     if (!isConnected()) { try { File file = new File(getFilesDir(), FilenameUtils.getBaseName(url)); webView.loadUrl("file://" + file.getAbsolutePath() + ".mht"); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Exception detected", Toast.LENGTH_LONG).show(); } } else { try { File file = new File(getFilesDir(), FilenameUtils.getBaseName(url)); webView.loadUrl(url); webView.saveWebArchive("file://" + file.getAbsolutePath() + ".mht"); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Exception detected", Toast.LENGTH_LONG).show(); } } 

我尝试将webView.saveWebArchive()用于不同的路径,包括简单的/path/to/filefile:///path/to/file等,但均无济于事。 我最接近在WebView上显示内容的是一堆原始MHTML,但显然它并未呈现。 我还得到了“找不到文件”屏幕和纯白屏幕,上面没有任何内容。

如何正确地将WebView中的网页保存到Web存档中,然后从本地存储中检索并再次显示为网页?

编辑:

正如greenapps在评论中所建议的那样,我覆盖了WebViewClient中的“ onPageFinished”方法,并在其中调用了“ saveWebArchive()”:

@Override
public void onPageFinished(WebView view, String link) {

    view.saveWebArchive(path);
    showMsg("Finished loading");

}

当电话连接到Internet并加载主页时,它确实显示“完成加载”。 关闭应用程序后,断开连接并再次打开它,它现在显示的背景为空白,具有原始页面的颜色,没有更多的白色页面或错误消息。 但是,没有任何图像,文字或任何东西。

这里的问题是,您需要等待页面完成加载,然后再尝试将其保存到存档中。

webView.loadUrl(url);
webView.saveWebArchive(path);

由于该页面尚未完全加载,因此无法使用。 因此,您仅在页面完成时才需要覆盖WebViewClient中的“ onPageFinished”方法以保存存档:

webView.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView view, String url) {

        if (isConnected()) {

            try {

                Thread.sleep(2000);
                view.saveWebArchive(path_to_saveDir);

            } catch (InterruptedException e) {

                Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();

            }

        }

    }

});

请注意,我使用Thread.sleep(2000)是因为页面加载时有一个jQuery动画,因此它要等待2秒钟才能完成动画,然后保存Web存档。

webView.loadUrl(url); 
webView.saveWebArchive("file://" + file.getAbsolutePath() + ".mht");. 

您无法在此处保存页面。

太早了。

该页面尚未加载。

在onPageLoaded()或onPageFinished()中进行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM