保存网页以供离线使用并调用相同的android

时间:2013-07-05 08:11:46

标签: android android-webview

我有一个Android应用程序要求,我需要打开已保存的网页,如何做同样的事情?首先,我们如何在Android上保存具有依赖性的网页,然后在您的应用程序中打开它?任何输入都会有很大的帮助!

2 个答案:

答案 0 :(得分:1)

这就是我实现的方式:

  • 将原始网页保存到文件
  • 解析保存的文件并获取所有图片网址。将图像保存到同一目录中。
  • 转换图像的URL(将所有链接绑定到本地副本)

以下是展示这一想法的简单代码:

String download(String url) throws Exception {
    String filename = "local.html";
    save(url, filename);

    List<String> imageLinks = getImageURLs(filename);
    for (String imageLink : imageLinks) {
        String imageFileName = getImageName(imageLink);
        save(imageLink, imageFileName);
    }

    convertImageURLs(filename);
    return filename;
}

void save(String url, String saveTo) throws Exception {
    HttpURLConnection conn = (HttpURLConnection) (new URL(url)).openConnection();
    conn.connect();
    InputStream is = conn.getInputStream();
    save(is, saveTo);
}

void save(InputStream is, String saveTo) {
    // save actual content
}

List<String> getImageURLs(String localHtmlFile) {
    // parse localHtmlFile and get all URLs for the images
    return Collections.EMPTY_LIST;
}

String getImageName(String imageLink) {
    // get image name, from url
    return null;
}

void convertImageURLs(String localHtmlFile) {
    // convert all URLs of the images, something like:
    // <img src="original_url"> -> <img src="local_url">
}

答案 1 :(得分:1)

首先,让我们从 webview

中保存 webarchive
private void initUI{
     webView = (WebView) findViewById(R.id.webView);
     AndroidWebClient client = new AndroidWebClient();
     webView.setWebViewClient(client);
     WebSettings webSettings = webView.getSettings();
     webSettings.setJavaScriptEnabled(true);
}
private class AndroidWebClient extends WebViewClient {
        @Override
        public void onPageStarted(WebView view, String url,
                                  android.graphics.Bitmap favicon) {                
        }
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            view.saveWebArchive(Environment.getExternalStorageDirectory()
                    + File.separator +"myArchive"+".mht");
            // our webarchive wull be available now at the above provided location with name "myArchive"+".mht"

        }
        public void onLoadResource(WebView view, String url) {

        }
      }

保存webarchive的方法在所有API中都是相同的,但要加载它,会有所不同

API的

小于Kitkat

private void loadArchive(){
     String rawData = null;
        try {
            rawData =   getStringFromFile(Environment.getExternalStorageDirectory()
                    + File.separator+"myArchive"+".mht");
        } catch (Exception e) {
            e.printStackTrace();
        }
webView.loadDataWithBaseURL(null, rawData, "application/x-webarchive-xml", "UTF-8", null);
}

  public String getStringFromFile (String filePath) throws Exception {
        File fl = new File(filePath);
        FileInputStream fin = new FileInputStream(fl);
        String ret = convertStreamToString(fin);
        //Make sure you close all streams.
        fin.close();
        return ret;
    }

    public  String convertStreamToString(InputStream is) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\n");
        }
        reader.close();
        return sb.toString();
    }

适用于Kitkat及以上

private void loadArchive(){
   webView.loadUrl("file:///"+Environment.getExternalStorageDirectory()
                + File.separator+"myArchive"+".mht");
}