Download Crutch工作原理解析

37 篇文章 0 订阅
6 篇文章 0 订阅

在Android Market上有一款非常实用的小软件:Download Crutch。
它解决的基本问题是这样:Android的默认浏览器,在下载文件时,会验证MimeType,如果这个MimeType不被“识别”,那么Download Manager会拒绝对其进行下载。Download Crutch可以让Download Manager不管是否是可识别的MimeType都进行下载。
凡是挂入系统的应用,走让人觉得很神奇。而Download Crutch这个小软件,更是实现的非常巧妙,理论上讲,它可以一行代码都不写就实现这个功能。
想要探究Download Crutch的工作原理,我们就要从Browser和Download Manager的工作原理说起。

Browser的核心是WebView组件,它负责处理所有WebView可以接受(或者说显示)的文件类型。比如HTML页面,或者各种Image。当WebView遇到一个他不认识的MimeType时,比如application/zip,它就会把它提交给DownloadManager,请求DownloadManager进行下载。
DownloadManager在接收到下载请求的时候,并会立即启动HTTP线程进行下载,它先会构造一个Intent,询问系统内是否有某个应用程序对这个要下载的文件类型该兴趣(或者说,可以在下载后处理这种文件类型)。如果回应的结果是没有哪个应用程序处理这个MimeType,那么DownloadManager会拒绝下载这个文件。关键代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
 * file: DownloadService.java
 * package: com.android.providers.downloads
 */

            Intent mimetypeIntent = new Intent (Intent. ACTION_VIEW ) ;
            mimetypeIntent. setDataAndType (Uri. fromParts ( "file", "", null ), info. mimetype ) ;
            ResolveInfo ri = getPackageManager ( ). resolveActivity (mimetypeIntent,
                    PackageManager. MATCH_DEFAULT_ONLY ) ;
            //如果找不到ResolveInfo,则认为没有应用程序可以处理这种mimetype。
            //下载工作将被终止
            if (ri == null ) {
                   ……
                    return ;
            }

所以,要想解决DownloadManager拒绝下载的问题,只需要编写一个应用程序,告诉系统所有的MimeType我都能处理,你就尽管下吧。于是就诞生了DownloadCrutch。
要实现DownloadCrutch的功能,只需要建立一个Android Project,编写一个空的Activity,命名为DownloadCrutch,并且在AndroidManifest.xml里进行注册。关键代码如下

1
2
3
4
5
6
7
8
        <activity android:name=".DownloadCrutch">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="file" />
                <data android:mimeType="*/*" />
            </intent-filter>
        </activity>

其中,android:scheme标记对file://xxxxx的URI结构进行处理,android:mimeType标记可以处理任意类型的文件。

怎么样,一行java代码都不用写,就可以实现这个功能吧。但是DownloadCrutch也写了一些Java代码,这也是一种很无奈的选择,因为DownloadManager在现在完成后,会拉起能处理此MimeType的应用程序来处理该文件,如果你一行代码也不写,那么会拉起一个黑窗口的Activity,用户体验太差,所以DownloadCrutch在代码里加了个小Toast,提示用户:“俺只管让它下载下来,怎么处理你自己解决吧”。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值