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天,万事大吉!还算有点收获!有不明白的留言,有好想法的也可以留言!分享一下自己的想法,锻炼自己的交流能力!