Android下保存简单网页到本地(包括简单图片链接转换)实现代码_Android

最近在做一个项目涉及到将包含图片的简单网页下载到本地,方便离线时观看,在这里分享一下,大家做下简单修改就可以用到自己的项目中了。(这里用到了AQuery库)

复制代码 代码如下:

package com.nekocode.xuedao.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.androidquery.AQuery;
import com.androidquery.callback.AjaxCallback;
import com.androidquery.callback.AjaxStatus;
import com.nekocode.xuedao.PublicData;
import com.nekocode.xuedao.PublicData.Subscribe;

public class HtmlStorageHelper {
 private String URL = "http://eduproject.sinaapp.com/fetchurl.php/getcontent/";
 private PublicData pd;
 private AQuery aq;
 private SQLiteDatabase mDB;
 private String mDownloadPath;

 public HtmlStorageHelper(Context context) {
  pd = PublicData.getInstance();
  aq = new AQuery(context);
  mDB = context.openOrCreateDatabase("data.db", Context.MODE_PRIVATE, null);
  mDB.execSQL("create table if not exists download_html(_id INTEGER PRIMARY KEY AUTOINCREMENT, content_id TEXT NOT NULL, title TEXT NOT NULL)");

  mDownloadPath = pd.mAppPath + "download/";
  File dir_file = new File(pd.mAppPath + "download/");
  if(!dir_file.exists())
   dir_file.mkdir();
 }

 public void saveHtml(final String id, final String title) {
  if(isHtmlSaved(id))
   return;

  aq.ajax(URL+id, String.class, new AjaxCallback<String>() {
   @Override
   public void callback(String url, String html, AjaxStatus status) {
    File dir_file = new File(mDownloadPath + id);
    if(!dir_file.exists())
     dir_file.mkdir();

    Pattern pattern = Pattern.compile("(?<=src=\")[^\"]+(?=\")");
    Matcher matcher = pattern.matcher(html);
    StringBuffer sb = new StringBuffer();
    while(matcher.find()){
     downloadPic(id, matcher.group(0));
     matcher.appendReplacement(sb, formatPath(matcher.group(0)));
    }
    matcher.appendTail(sb);
    html = sb.toString();

    writeHtml(id, title, html);
   }
  });
 }

 private void downloadPic(String id, String url) {
  File pic_file = new File(mDownloadPath + id + "/" + formatPath(url));
  aq.download(url, pic_file, new AjaxCallback<File>() {
   @Override
   public void callback(String url, final File file, AjaxStatus status) {
   }
  });
 }

 private void writeHtml(String id, String title, String html) {
  File html_file = new File(mDownloadPath + id + "/index.html");
  FileOutputStream fos = null;
  try {
   fos=new FileOutputStream(html_file);
            fos.write(html.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                fos.close();
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }

  ContentValues values = new ContentValues();
  values.put("content_id", id);
  values.put("title", title);
  mDB.insert("download_html", "_id", values);
 }

 public boolean isHtmlSaved(String id) {
  File file = new File(mDownloadPath + id);
  if(file.exists()) {
   file = new File(mDownloadPath + id + "/index.html");
   if(file.exists())
    return true;
  }
  deleteHtml(id);
  return false;
 }

 public String getTitle(String id) {
  Cursor c = mDB.rawQuery("select * from download_html where content_id=?", new String[]{id});
  if(c.getCount() == 0)
   return null;

  c.moveToFirst();
  int index1 = c.getColumnIndex("title");

  return c.getString(index1);
 }

 public ArrayList<Subscribe> getHtmlList() {
  Cursor c = mDB.rawQuery("select * from download_html", null);
  ArrayList<Subscribe> list = new ArrayList<Subscribe>();
  if(c.getCount() != 0) {
   c.moveToFirst();
   int index1 = c.getColumnIndex("content_id");
   int index2 = c.getColumnIndex("title");

   while (!c.isAfterLast()) {
    String id = c.getString(index1);
    if(isHtmlSaved(id)) {
     Subscribe sub = new Subscribe(
       id,
       c.getString(index2),
       Subscribe.FILE_DOWNLOADED
       );
     list.add(sub);
    }

    c.moveToNext();
   }
  }

  return list;
 }

 public void deleteHtml(String id) {
  mDB.delete("download_html", "content_id=?", new String[]{id});
  File dir_file = new File(mDownloadPath + id);
  deleteFile(dir_file);
 }

 private void deleteFile(File file) {
  if (file.exists()) { // 判断文件是否存在
   if (file.isFile()) { // 判断是否是文件
    file.delete(); // delete()方法 你应该知道 是删除的意思;
   } else if (file.isDirectory()) { // 否则如果它是一个目录
    File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
    for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
     this.deleteFile(files[i]); // 把每个文件 用这个方法进行迭代
    }
   }
   file.delete();
  } else {
   //
  }
 }

 private String formatPath(String path) {
        if (path != null && path.length() > 0) {
            path = path.replace("\\", "_");
            path = path.replace("/", "_");
            path = path.replace(":", "_");
            path = path.replace("*", "_");
            path = path.replace("?", "_");
            path = path.replace("\"", "_");
            path = path.replace("<", "_");
            path = path.replace("|", "_");
            path = path.replace(">", "_");
        }
        return path;
    }
}

时间: 2024-12-22 14:15:09

Android下保存简单网页到本地(包括简单图片链接转换)实现代码_Android的相关文章

如何用C#编程保存一个网页到本地文件夹下

问题描述 我在做一个下载器,主要是要下载百度文库资源无财富币不用登陆下载想要的文档,wap浏览下载网页.我想用C#编程程序保存该网页到本地文件夹下,再用读取文件流的方式读出该wap网页中的文档内容保存.这个过程怎么实现,求大牛指点,谢! 解决方案 解决方案二:先google.百度解决方案三:参考privatevoidPage_Load(objectsender,System.EventArgse){stringurl="http://zhidao.baidu.com/question/50742

Mac如何保存整个网页到本地

  网页太大无法截图怎么办?当我们想给网页截图但是网页太长超出屏幕的时候,完全没有必要购买那些坑爹的网页快照软件,因为Mac系统就给我们备着呢,下面小编给大家介绍下Mac系统下如何保存整个网页到本地. 1.打开一个你想保存的网页,然后点选文件-打印,会弹出一个配置框,如上图所示. 2.然后点击左下角的PDF,保存为PDF: 剩下的你懂了吧,直接保存为PDF文件,这个功能极其有用啊,尤其是当你想抄袭某篇论文的时候.

Mac保存整个网页到本地方法

  现在,很多人都在使用Mac电脑.而有时候,我们发现,网页太大而无法截图.那么, 这该怎么办?当我们想给网页截图但是网页太长超出屏幕的时候,完全没有必要购买那些坑爹的网页快照软件,因为Mac系统就给我们备着呢,下面小编给大家介绍下Mac保存整个网页到本地方法. 1.打开一个你想保存的网页,然后点选文件-打印,会弹出一个配置框,如上图所示. 2.然后点击左下角的PDF,保存为PDF: 剩下的你懂了吧,直接保存为PDF文件,这个功能极其有用啊,尤其是当你想抄袭某篇论文的时候.

如何保存整个网页到本地

  当我们想给网页截图但是网页太长超出屏幕的时候,完全没有必要购买那些坑爹的网页快照软件,因为Mac系统就给我们备着呢.很简单很快捷. 打开一个你想保存的网页,然后点选文件-打印,会弹出一个配置框,如上图所示. 然后点击左下角的PDF-保存为PDF: 剩下的你懂了吧,直接保存为PDF,这个功能极其有用啊,尤其是当你想抄袭某篇论文[大误]的时候.

Android下拉刷新上拉加载控件(适用于所有View)_Android

     前面写过一篇关于下拉刷新控件的文章下拉刷新控件终结者:PullToRefreshLayout,后来看到好多人还有上拉加载更多的需求,于是就在前面下拉刷新控件的基础上进行了改进,加了上拉加载的功能.不仅如此,我已经把它改成了对所有View都通用!可以随心所欲使用这两个功能~~     我做了一个大集合的demo,实现了ListView.GridView.ExpandableListView.ScrollView.WebView.ImageView.TextView的下拉刷新和上拉加载.后

Android图片裁剪功能实现代码_Android

在Android应用中,图片裁剪也是一个经常用到的功能.Android系统中可以用隐式意图调用系统应用进行裁剪,但是这样做在不同的手机可能表现出不同的效果,甚至在某些奇葩手机上还会出其他更奇怪的问题,所以调用系统功能进行图片裁剪在很多时候对我们来说并不是一个好的选择.这时候就需要我们自己去实现这种裁剪功能了. 功能分析 要完成图片裁剪的功能,我们需要先知道图片裁剪的功能有哪些.图片裁剪之前,我们需要有一个框指示我们需要裁剪的样式合大小.图片显示出来后大小和位置可能并不是我们所期望的,所以我们还需

Android动画 实现开关按钮动画(属性动画之平移动画)实例代码_Android

Android动画 实现开关按钮动画(属性动画之平移动画),最近做项目,根据项目需求,有一个这样的功能,实现类似开关的动画效果,经过自己琢磨及上网查找资料,终于解决了,这里就记录下: 在Android里面,一些炫酷的动画确实是很吸引人的地方,让然看了就赏心悦目,一个好看的动画可能会提高用户对软件的使用率.另外说到动画,在Android里面支持3种动画: 逐帧动画(Frame Animation).补间动画(Tween Animation)和属性动画(Property Animation),至于这

固定网页背景图同时保持图片比例的思路代码_javascript技巧

提供一个背景图片策略: 1,背景图片固定 2,随窗口大小改变而改变大小 3,保持比例不变而缩放 支持浏览器:IE 6,7,8,9+ ,FF,Chrome 演示地址:http://www.einino.net/bg_image.html 复制代码 代码如下: <style> body{margin:0; padding:0;height:2000px; } #background_img{ top:expression(documentElement.scrollTop); /*we need

android获取音乐文件的内置专辑图片实现思路及代码_Android

代码和注释如下: 复制代码 代码如下: private Cursor getCursor(String filePath) { String path = null; Cursor c = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); // System.out.printl