簡體   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