`
jandroid
  • 浏览: 1953886 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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);

这个方法;

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

分享到:
评论

相关推荐

    android4.0 Browser 浏览器 源码

    Android 4.0 Browser是Android操作系统的一个重要组成部分,它提供了用户访问互联网的界面和功能。在深入探讨其源码之前,我们先理解一下Android 4.0(也称为Ice Cream Sandwich,简称ICS)的一些背景信息。 ...

    Android 4.0 Browser源码

    Android 4.0 Browser源码分析 Android 4.0,也称为Ice Cream Sandwich (ICS),是Android操作系统的一个重要版本,引入了许多用户界面和功能改进。在这个版本中,内置的Browser应用进行了重大更新,提供了更流畅的...

    android browser 源码直接导入eclipse中可以使用

    7. **调试技巧**:学习如何在Eclipse环境中调试Android源码,可以帮助开发者快速定位和解决问题,提高开发效率。 8. **版本兼容性**:Android Browser是早期版本的默认浏览器,源码可以帮助开发者了解不同Android...

    android源码之Browser

    深入理解Android源码中的Browser模块对于Android应用开发者来说至关重要,因为这能帮助他们优化网页加载性能,实现自定义功能,以及更好地理解和调试与浏览器相关的错误。下面我们将详细探讨Android Browser源码中的...

    安卓Android源码——Zirco-browser浏览器.zip

    【标题】:“安卓Android源码——Zirco-browser浏览器” 这个标题揭示了我们要探讨的核心内容:Zirco-browser,一个基于Android操作系统的开源浏览器。在Android平台上,开发自定义浏览器通常涉及对Android SDK、...

    Android Browser 源码

    1. **WebView组件**:Android Browser的核心是WebView组件,它是一个可以在应用程序中嵌入的Web浏览器控件。WebView基于WebKit渲染引擎,允许开发者加载和显示HTML、CSS和JavaScript内容。通过分析源码,我们可以...

    Android应用源码安卓源码(172个合集).zip

    Android应用源码安卓源码(172个合集),可以做为你的学习参考。 365MobileSecretary v1.0.6(365手机助手AIDL) 888个经典 Logo.rar AdXmpp(Openfire+asmack+spark) .zip AidlDemo(简单aidl的例子) aidl跨进程调用....

    Android4.2.2 Browser 浏览器模块源码

    在Android 4.2.2_r1版本中,Browser模块是系统核心组件之一,负责提供网页浏览功能。这个模块的源代码深入揭示了Android浏览器如何处理网页加载、渲染、交互以及与其他系统服务的通信。接下来,我们将详细探讨该源码...

    android 2.3 Browser 源码 0分下载

    2. **Java层组件**:在Android系统中,Browser应用由一系列Java类组成,如`BrowserActivity`负责用户界面,`WebView`作为浏览器的视图组件,`WebViewClient`处理页面加载事件,以及`WebSettings`控制浏览器的行为和...

    Android 5.0 Browser源码

    **Android 5.0 Browser源码详解** 在深入探讨Android 5.0浏览器源码之前,我们首先要理解Android操作系统的基本架构。Android是一个基于Linux内核的开源移动操作系统,由Google领导的开放手机联盟开发。其核心组件...

    安卓Android源码——zirco-browser浏览器源码.zip

    《安卓Android源码——Zirco-Browser浏览器解析》 在深入探讨Zirco-Browser浏览器的源码之前,我们首先要理解的是,Android系统是一个基于Linux内核的开源操作系统,主要用于移动设备,如智能手机和平板电脑。...

    Android应用源码10套安卓源码合集.zip

    Android应用源码10套安卓源码合集: android应用源码DroidBrowser浏览器.rar android应用源码QQ_UI之分类菜单.rar android应用源码QQ的登录界面.rar android应用源码Socket的客户端通信.rar android应用源码tooxin图...

    安卓Android源码——Browser.rar

    本资源"安卓Android源码——Browser.rar"提供的是Android系统自带浏览器——Browser应用的相关源代码,这对于开发者来说是一份宝贵的参考资料。通过分析这份源码,我们可以深入了解Android系统的WebView组件、网络...

    Android应用源码之Browser.zip

    总结,Browser.zip提供的源码是一份全面的学习资料,涵盖了Android开发中的许多重要知识点,对于提升Android应用开发技能,特别是WebView相关技术的掌握,具有极高的价值。通过对源码的深入学习和研究,开发者不仅...

    android4.0 Browser浏览器 源代码

    Android 4.0 Browser浏览器源代码是Android操作系统中内置浏览器的开发基础,它包含了实现一个功能完备、高效、用户友好的Web浏览体验的所有组件。这个模块涵盖了应用层的源码,为开发者提供了一个深入理解Android...

    Android应用源码之zirco-browser浏览器源码.zip项目安卓应用源码下载

    Android应用源码之zirco-browser浏览器源码.zip项目安卓应用源码下载Android应用源码之zirco-browser浏览器源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目...

    android应用源码Zirco-browser浏览器.zip项目安卓应用源码下载

    android应用源码Zirco-browser浏览器.zip项目安卓应用源码下载android应用源码Zirco-browser浏览器.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    安卓Android源码——Zirco-browser:超越海豚的开源浏览器.zip

    《安卓Android源码解析——深度探索Zirco-browser:打造超越海豚的开源浏览器》 在移动设备领域,安卓Android操作系统以其开放性和可定制性深受开发者喜爱。在众多的安卓应用中,浏览器作为用户接触互联网的主要...

Global site tag (gtag.js) - Google Analytics