Android中Browser中下载覆盖的提示【安卓源码Browser系列一】
来源:互联网 发布:约球软件 编辑:程序博客网 时间:2024/05/17 06:19
安卓官方的Browser的写的真是不怎么样,上个月让我做了一个功能,是修改browser下载的修改,如果sdcard中有了这个文件,就弹出一个Dialog,提示内容为“改文件已经存在,是否覆盖?”,是就删除这个文件,重新下载,否就不做任何操作!谷歌源码的流程是下载文件会另外取个名字,参见Android 下载重复文件命名规则【android源码解析七】这篇文章写得很详细,介绍谷歌源码下载文件后命名规范!
大明原创,转载请标明出处:http://blog.csdn.net/wdaming1986/article/details/7413150
主要的思路:
1、分析安卓下载的命名规范;
2、分析安卓下载文件后的保存路径;
3、路径+文件的名字,可以构成一个File,判断File是否存在?
4、弹dialog,提示是否覆盖?
5、如果选择是,就把这个File删除,然后重新下载;选择否,不做任何操作!
下面看代码:在Browser工程里面;
在/*package */ void/*下载流*/onDownloadStartNoStream(String url, String userAgent,
String contentDisposition, String mimetype, long contentLength) {
这个方法里面:
修改这个final Uri contentUri = getContentResolver().insert(Downloads.Impl.CONTENT_URI,
values);
这个方法;
private static String sdcardPath = "/mnt/sdcard/download/"; /*add by wangxianming in order to make the same file *when downloading Prompt *"whether is cover the file or not" *on 2012-3-2 *on start */boolean isInsert = true;File base = new File(sdcardPath); String downloadfilename = filename.replaceAll("[^a-zA-Z0-9\\.\\-_]+", "_"); // Split filename between base and extension // Add an extension if filename does not have one String extension = null; int dotIndex = downloadfilename.indexOf('.'); if (dotIndex < 0) { extension = chooseExtensionFromMimeType(mimetype, true); } else { extension = chooseExtensionFromFilename(mimetype, downloadfilename, dotIndex); } if(extension != null && !"".equals(extension) && extension.length() > 1){ base = new File(base,extension.substring(1).toLowerCase()); } final String sdcardFilePath = base.getPath() + File.separator + downloadfilename; File downloadFilePath = new File(sdcardFilePath); if(downloadFilePath != null && downloadFilePath.exists()) { isInsert = false; new AlertDialog.Builder(this).setTitle(R.string.clear_history_tips) .setIcon(android.R.drawable.ic_dialog_alert).setMessage( R.string.download_cover_or_not).setPositiveButton( R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { int deleteNumRow = getContentResolver().delete( Downloads.Impl.CONTENT_URI, Downloads.Impl.COLUMN_FILE_NAME_HINT + "='" + filename + "'", null); if (deleteNumRow != 0) { if (sdcardFilePath != null) { File downloadfile = new File(sdcardFilePath); downloadfile.delete(); } } final Uri contentUri = getContentResolver().insert(Downloads.Impl.CONTENT_URI, values); Toast.makeText(BrowserActivity.this, R.string.download_pending, Toast.LENGTH_SHORT).show(); } }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }).create().show(); } if (isInsert) { final Uri contentUri = getContentResolver().insert(Downloads.Impl.CONTENT_URI, values); Toast.makeText(this, R.string.download_pending, Toast.LENGTH_SHORT).show(); }//on end
判断类型的方法:
private static String chooseExtensionFromMimeType(String mimeType, boolean useDefaults) { String extension = null; if (mimeType != null) { extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); if (extension != null) { if (true) { Log.v(LOGTAG, "adding extension from type"); } extension = "." + extension; } else { if (true) { Log.v(LOGTAG, "couldn't find extension for " + mimeType); } } } if (extension == null) { if (mimeType != null && mimeType.toLowerCase().startsWith("text/")) { if (mimeType.equalsIgnoreCase("text/html")) { Log.v(LOGTAG, "adding default html extension"); extension = ".html"; } else if (useDefaults) { Log.v(LOGTAG, "adding default text extension"); extension = ".txt"; } } else if (useDefaults) { Log.v(LOGTAG, "adding default binary extension"); extension = ".bin"; } } return extension; }
截取最后的.,安卓在Browser中下载的文件都是放到download这个文件夹的,然后截取不同的类型再建立文件夹,比如mp3,apk,等等,这都可以是文件夹的名字,然后把下载的文件归类的形式下载到相应的文件夹中,截取文件的“.”以前的名字作为文件夹的名字,方法如下:
private static String chooseExtensionFromFilename(String mimeType, String filename, int dotIndex) { String extension = null; if (mimeType != null) { // Compare the last segment of the extension against the mime type. // If there's a mismatch, discard the entire extension. int lastDotIndex = filename.lastIndexOf('.'); String typeFromExt = MimeTypeMap.getSingleton().getMimeTypeFromExtension( filename.substring(lastDotIndex + 1)); if (typeFromExt == null || !typeFromExt.equalsIgnoreCase(mimeType)) { extension = chooseExtensionFromMimeType(mimeType, false); if (extension != null) { Log.v(LOGTAG, "substituting extension from type"); } else { Log.v(LOGTAG, "couldn't find extension for " + mimeType); } } } if (extension == null) { Log.v(LOGTAG, "keeping extension"); extension = filename.substring(dotIndex); } return extension; }
组装整个文件的路径的变量:final String sdcardFilePath = base.getPath() + File.separator + downloadfilename;
这样就完事ok了,经测试运行1个多月没有问题。哈哈,所以把代码分享给大家,这个功能做了3天呢!中间有点思路走偏了,我从数据库中取Url去了,导致判断方法不是特别的好,经过我老大指导说判断文件是否存在?所以我就依这个思想来做的,做了1天,万事大吉!还算有点收获!有不明白的留言,有好想法的也可以留言!分享一下自己的想法,锻炼自己的交流能力!
- Android中Browser中下载覆盖的提示【安卓源码Browser系列一】
- Android中Browser中下载覆盖的提示【安卓源码Browser系列一】
- 如何修改Android中Browser的UserAgent
- 如何修改Android中Browser的UserAgent
- android中Browser地址栏隐藏
- Android Browser App 源码分析(一)
- Web Browser的网页中关闭Web Browser程序
- Android Browser网络下载模块的实现
- 在android的Browser中设置User Agent
- 在android的Browser中设置User Agent
- Android browser kitkat中关于jni的调用
- 在android的Browser中设置User Agent
- Android中增加和删除Browser书签
- Android中获取,增加,删除Browser书签 .
- Android Browser学习一 application的初始化
- JavaScript中Browser 对象
- jQuery 中$.browser 替换
- PB中使用WEB Browser的異常問題
- [转]多重继承 虚继承
- 取a数组里面的8个数字!让他们结果相加等于1979970
- 全文检索项目开发阶段经验总结
- OLED
- PowerBuilder制作IE风格的图标按钮
- Android中Browser中下载覆盖的提示【安卓源码Browser系列一】
- 用PowerBuilder开发多媒体播放器
- 用Powerbuilder开发WEB数据库
- 在PB中用Flash制作Splash封面
- PB程序中在普通激光打印机上实现条码打印
- C语言优先级和(i++)+(i++)与(++i)+(++i)
- 14. Template Method模式代码
- 在powerbuilder中向Excel传递数据
- 小议C语言中数据的存储类型