Android下保存简单网页到本地(包括简单图片链接转换)实现代码
最近在做一个项目涉及到将包含图片的简单网页下载到本地,方便离线时观看,在这里分享一下,大家做下简单修改就可以用到自己的项目中了。(这里用到了AQuery库)
packagecom.nekocode.xuedao.utils;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.util.ArrayList;
importjava.util.regex.Matcher;
importjava.util.regex.Pattern;
importandroid.content.ContentValues;
importandroid.content.Context;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importcom.androidquery.AQuery;
importcom.androidquery.callback.AjaxCallback;
importcom.androidquery.callback.AjaxStatus;
importcom.nekocode.xuedao.PublicData;
importcom.nekocode.xuedao.PublicData.Subscribe;
publicclassHtmlStorageHelper{
privateStringURL="http://eduproject.sinaapp.com/fetchurl.php/getcontent/";
privatePublicDatapd;
privateAQueryaq;
privateSQLiteDatabasemDB;
privateStringmDownloadPath;
publicHtmlStorageHelper(Contextcontext){
pd=PublicData.getInstance();
aq=newAQuery(context);
mDB=context.openOrCreateDatabase("data.db",Context.MODE_PRIVATE,null);
mDB.execSQL("createtableifnotexistsdownload_html(_idINTEGERPRIMARYKEYAUTOINCREMENT,content_idTEXTNOTNULL,titleTEXTNOTNULL)");
mDownloadPath=pd.mAppPath+"download/";
Filedir_file=newFile(pd.mAppPath+"download/");
if(!dir_file.exists())
dir_file.mkdir();
}
publicvoidsaveHtml(finalStringid,finalStringtitle){
if(isHtmlSaved(id))
return;
aq.ajax(URL+id,String.class,newAjaxCallback<String>(){
@Override
publicvoidcallback(Stringurl,Stringhtml,AjaxStatusstatus){
Filedir_file=newFile(mDownloadPath+id);
if(!dir_file.exists())
dir_file.mkdir();
Patternpattern=Pattern.compile("(?<=src=\")[^\"]+(?=\")");
Matchermatcher=pattern.matcher(html);
StringBuffersb=newStringBuffer();
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);
}
});
}
privatevoiddownloadPic(Stringid,Stringurl){
Filepic_file=newFile(mDownloadPath+id+"/"+formatPath(url));
aq.download(url,pic_file,newAjaxCallback<File>(){
@Override
publicvoidcallback(Stringurl,finalFilefile,AjaxStatusstatus){
}
});
}
privatevoidwriteHtml(Stringid,Stringtitle,Stringhtml){
Filehtml_file=newFile(mDownloadPath+id+"/index.html");
FileOutputStreamfos=null;
try{
fos=newFileOutputStream(html_file);
fos.write(html.getBytes());
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
fos.close();
}catch(Exceptione2){
e2.printStackTrace();
}
}
ContentValuesvalues=newContentValues();
values.put("content_id",id);
values.put("title",title);
mDB.insert("download_html","_id",values);
}
publicbooleanisHtmlSaved(Stringid){
Filefile=newFile(mDownloadPath+id);
if(file.exists()){
file=newFile(mDownloadPath+id+"/index.html");
if(file.exists())
returntrue;
}
deleteHtml(id);
returnfalse;
}
publicStringgetTitle(Stringid){
Cursorc=mDB.rawQuery("select*fromdownload_htmlwherecontent_id=?",newString[]{id});
if(c.getCount()==0)
returnnull;
c.moveToFirst();
intindex1=c.getColumnIndex("title");
returnc.getString(index1);
}
publicArrayList<Subscribe>getHtmlList(){
Cursorc=mDB.rawQuery("select*fromdownload_html",null);
ArrayList<Subscribe>list=newArrayList<Subscribe>();
if(c.getCount()!=0){
c.moveToFirst();
intindex1=c.getColumnIndex("content_id");
intindex2=c.getColumnIndex("title");
while(!c.isAfterLast()){
Stringid=c.getString(index1);
if(isHtmlSaved(id)){
Subscribesub=newSubscribe(
id,
c.getString(index2),
Subscribe.FILE_DOWNLOADED
);
list.add(sub);
}
c.moveToNext();
}
}
returnlist;
}
publicvoiddeleteHtml(Stringid){
mDB.delete("download_html","content_id=?",newString[]{id});
Filedir_file=newFile(mDownloadPath+id);
deleteFile(dir_file);
}
privatevoiddeleteFile(Filefile){
if(file.exists()){//判断文件是否存在
if(file.isFile()){//判断是否是文件
file.delete();//delete()方法你应该知道是删除的意思;
}elseif(file.isDirectory()){//否则如果它是一个目录
Filefiles[]=file.listFiles();//声明目录下所有的文件files[];
for(inti=0;i<files.length;i++){//遍历目录下所有的文件
this.deleteFile(files[i]);//把每个文件用这个方法进行迭代
}
}
file.delete();
}else{
//
}
}
privateStringformatPath(Stringpath){
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(">","_");
}
returnpath;
}
}
相关文章
- android onresume方法,非静态方法’onResume’Android Studio
- android 空间分享到朋友圈,Android开发之微信分享到好友,朋友圈
- android签名命令行,Android系统签名位置及命令
- android okio使用方法,Android 开源框架 Okio 原理剖析「建议收藏」
- Android LitePal数据库
- delphixe5 android,Delphi XE5 Android手机端转换Ansi字符串
- android 定时器实例,Android定时器和Handler用法实例分析
- Android angle_android 界面悬停
- android activitymanager 系统api_Android view
- Android Services Library_android freeware
- android 系统浏览器 源码-Android 最最最简单的浏览器代码
- 【Android 应用开发】Canvas 绘制文字 ( 文字尺寸测量 | 基线绘制 )
- 【错误记录】Android 注解处理器报错 ( 非法的类文件开始 , 请删除该文件或确保该文件位于正确的类路径子目录中。 )
- 【Android UI】Paint Gradient 渐变渲染 ② ( SweepGradient 梯度渐变渲染 | 围绕中心点绘制扫描渐变的着色器 | 多渐变色构造函数 | 雷达扫描效果 )
- 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ⑤ ( 优化 Gradle 构建脚本 | 构建脚本结构 | 闭包定义及用法 | 依赖配置 | android 块配置 )
- 【Kotlin 协程】协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )
- Android控制文字水平间距android:letterSpacing详解手机开发
- Android中android:visibility的3中属性的剖析详解手机开发
- android 拍照resultCode 返回0,不等于RESULT_OK -1详解手机开发
- Android开发笔记之:深入理解Cursor相关的性能问题
- android将图片转换存到数据库再从数据库读取转换成图片实现代码
- Android中Activity跳转的创建步骤总结