Android中Browser中下载覆盖的提示【安卓源码Browser系列一】

 安卓官方的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);

       这个方法;

       

[java]  view plain copy print ?
  1. <span style="FONT-SIZE: 16px">private static String sdcardPath = "/mnt/sdcard/download/";  
  2.   
  3.             /*add by wangxianming in order to make the same file 
  4.              *when downloading Prompt 
  5.              *"whether is cover the file or not" 
  6.              *on 2012-3-2 
  7.              *on start 
  8.              */  
  9.   
  10. boolean isInsert = true;  
  11. File base = new File(sdcardPath);  
  12.                 String downloadfilename = filename.replaceAll("[^a-zA-Z0-9\\.\\-_]+""_");  
  13.                 // Split filename between base and extension  
  14.                 // Add an extension if filename does not have one  
  15.                 String extension = null;  
  16.                 int dotIndex = downloadfilename.indexOf('.');  
  17.                 if (dotIndex < 0) {  
  18.                     extension = chooseExtensionFromMimeType(mimetype, true);  
  19.                 } else {  
  20.                     extension = chooseExtensionFromFilename(mimetype, downloadfilename, dotIndex);  
  21.                 }  
  22.                 if(extension != null && !"".equals(extension) && extension.length() > 1){  
  23.                     base = new File(base,extension.substring(1).toLowerCase());  
  24.                 }  
  25.   
  26.                 final String sdcardFilePath = base.getPath() + File.separator + downloadfilename;  
  27.   
  28.                 File downloadFilePath = new File(sdcardFilePath);  
  29.                 if(downloadFilePath != null && downloadFilePath.exists()) {  
  30.                     isInsert = false;  
  31.                     new AlertDialog.Builder(this).setTitle(R.string.clear_history_tips)  
  32.                             .setIcon(android.R.drawable.ic_dialog_alert).setMessage(  
  33.                                     R.string.download_cover_or_not).setPositiveButton(  
  34.                                     R.string.ok, new DialogInterface.OnClickListener() {  
  35.                                         public void onClick(DialogInterface dialog,  
  36.                                                 int whichButton) {  
  37.                                             int deleteNumRow = getContentResolver().delete(  
  38.                                                     Downloads.Impl.CONTENT_URI,  
  39.                                                     Downloads.Impl.COLUMN_FILE_NAME_HINT + "='"  
  40.                                                             + filename + "'"null);  
  41.                                             if (deleteNumRow != 0) {  
  42.                                                 if (sdcardFilePath != null) {  
  43.                                                     File downloadfile = new File(sdcardFilePath);  
  44.                                                     downloadfile.delete();  
  45.                                                 }  
  46.                                             }  
  47.                                             final Uri contentUri = getContentResolver().insert(Downloads.Impl.CONTENT_URI,  
  48.                                                     values);  
  49.                                             Toast.makeText(BrowserActivity.this, R.string.download_pending, Toast.LENGTH_SHORT).show();  
  50.                                         }  
  51.                                     }).setNegativeButton(R.string.cancel,  
  52.                                     new DialogInterface.OnClickListener() {  
  53.                                         public void onClick(DialogInterface dialog,  
  54.                                                 int whichButton) {  
  55.                                         }  
  56.                                     }).create().show();  
  57.                 }  
  58.   
  59.                 if (isInsert) {  
  60.                     final Uri contentUri = getContentResolver().insert(Downloads.Impl.CONTENT_URI,  
  61.                             values);  
  62.                     Toast.makeText(this, R.string.download_pending, Toast.LENGTH_SHORT).show();  
  63.                 }//on end</span>  


   判断类型的方法:

  

[java]  view plain copy print ?
  1. <span style="FONT-SIZE: 16px">private static String chooseExtensionFromMimeType(String mimeType, boolean useDefaults) {  
  2.         String extension = null;  
  3.         if (mimeType != null) {  
  4.             extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType);  
  5.             if (extension != null) {  
  6.                 if (true) {  
  7.                     Log.v(LOGTAG, "adding extension from type");  
  8.                 }  
  9.                 extension = "." + extension;  
  10.             } else {  
  11.                 if (true) {  
  12.                     Log.v(LOGTAG, "couldn't find extension for " + mimeType);  
  13.                 }  
  14.             }  
  15.         }  
  16.         if (extension == null) {  
  17.             if (mimeType != null && mimeType.toLowerCase().startsWith("text/")) {  
  18.                 if (mimeType.equalsIgnoreCase("text/html")) {  
  19.                     Log.v(LOGTAG, "adding default html extension");  
  20.                     extension = ".html";  
  21.                 } else if (useDefaults) {  
  22.                     Log.v(LOGTAG, "adding default text extension");  
  23.                     extension = ".txt";  
  24.                 }  
  25.             } else if (useDefaults) {  
  26.                 Log.v(LOGTAG, "adding default binary extension");  
  27.                 extension = ".bin";  
  28.             }  
  29.         }  
  30.         return extension;  
  31.     }</span>  

 


    截取最后的.,安卓在Browser中下载的文件都是放到download这个文件夹的,然后截取不同的类型再建立文件夹,比如mp3,apk,等等,这都可以是文件夹的名字,然后把下载的文件归类的形式下载到相应的文件夹中,截取文件的“.”以前的名字作为文件夹的名字,方法如下:

[java]  view plain copy print ?
  1. <span style="FONT-SIZE: 16px">private static String chooseExtensionFromFilename(String mimeType,  
  2.             String filename, int dotIndex) {  
  3.         String extension = null;  
  4.         if (mimeType != null) {  
  5.             // Compare the last segment of the extension against the mime type.  
  6.             // If there's a mismatch, discard the entire extension.  
  7.             int lastDotIndex = filename.lastIndexOf('.');  
  8.             String typeFromExt = MimeTypeMap.getSingleton().getMimeTypeFromExtension(  
  9.                     filename.substring(lastDotIndex + 1));  
  10.             if (typeFromExt == null || !typeFromExt.equalsIgnoreCase(mimeType)) {  
  11.                 extension = chooseExtensionFromMimeType(mimeType, false);  
  12.                 if (extension != null) {  
  13.                     Log.v(LOGTAG, "substituting extension from type");  
  14.                 } else {  
  15.                     Log.v(LOGTAG, "couldn't find extension for " + mimeType);  
  16.                 }  
  17.             }  
  18.         }  
  19.         if (extension == null) {  
  20.             Log.v(LOGTAG, "keeping extension");  
  21.             extension = filename.substring(dotIndex);  
  22.         }  
  23.         return extension;  
  24.     }  
  25. </span>  


 

 

     组装整个文件的路径的变量final String sdcardFilePath = base.getPath() + File.separator + downloadfilename;

 

     这样就完事ok了,经测试运行1个多月没有问题。哈哈,所以把代码分享给大家,这个功能做了3天呢!中间有点思路走偏了,我从数据库中取Url去了,导致判断方法不是特别的好,经过我老大指导说判断文件是否存在?所以我就依这个思想来做的,做了1天,万事大吉!还算有点收获!有不明白的留言,有好想法的也可以留言!分享一下自己的想法,锻炼自己的交流能力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值