Android DownloadManager 使用简介

由于项目需要,用到了 DownloadManager,现在记录下。
1 DownloadManager 时 android api 9 之后添加的,那么需要你的 app 的minVersion >= 9;

2 AndroidManifest中添加权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3 构建 DownloadManger.Request 对象,设置一些参数,如下载路径,下载的网络环境等。可参考以下代码

// 文件的网络地址
String url = "http://xxx.xxx.xxx.apk";
// new 一个 Request 对象
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

// 是否同意漫游状态下执行操作( true 允许, false 不允许. 默认是允许的)
request.setAllowedOverRoaming(boolean);

// 表示允许MediaScanner扫描到这个文件,默认不允许。
request.allowScanningByMediaScanner();

//设置下载中通知栏提示的标题
request.setTitle("DownloadManager Title");

// 设置下载中通知栏提示的介绍
request.setDescription("DownloadManager Description");

// 表示下载进行中和下载完成的通知栏是否显示。默认只显示下载中通知。
// VISIBILITY_VISIBLE_NOTIFY_COMPLETED表示下载完成后显示通知栏提示。
// VISIBILITY_HIDDEN表示不显示任何通知栏提示,
// 这个需要在AndroidMainfest中添加权限android.permission.DOWNLOAD_WITHOUT_NOTIFICATION.
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

// 表示下载允许的网络类型,默认在任何网络下都允许下载。
// 有NETWORK_MOBILE、NETWORK_WIFI、NETWORK_BLUETOOTH三种及其组合可供选择。
// 如果只允许wifi下载,而当前网络为3g,则下载会等待。
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);

// 移动网络情况下是否允许漫游。
request.setAllowedOverRoaming(boolean allow);

// 设置文件的保存的位置[三种方式]
// 第一种
// file:///storage/emulated/0/Android/data/your-package/files/Download/xxx.apk
//request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, "xxx.apk");
// 第二种
// file:///storage/emulated/0/Download/xxx.apk
//request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "xxx.apk");
// 第三种 自定义文件路径 file:///sdcard/xxx/xxx.apk
String downloadFilePath = "/sdcard/xxx/xxx.apk"
File downloadFile = new File(downloadFilePath);
request.setDestinationUri(Uri.fromFile(downloadFile));

DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
// 执行下载,返回downloadId,downloadId可用于后面查询下载信息。
// 若网络不满足条件、Sdcard挂载中、超过最大并发数等异常会等待下载,正常则直接下载。
dm.enqueue(request);

4 下载进度状态监听及查询
DownloadManager.Query为下载管理对外开放的信息查询类,主要包括以下接口:

//根据下载id进行过滤
setFilterById(long… ids)
//根据下载状态进行过滤
setFilterByStatus(int flags)
//根据是否在download ui中可见进行过滤。
setOnlyIncludeVisibleInDownloadsUi(boolean value)
//根据列进行排序,不过目前仅支持DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP和DownloadManager.COLUMN_TOTAL_SIZE_BYTES排序。
orderBy(String column, int direction)

5 下载成功监听
下载完成后,下载管理会发出DownloadManager.ACTION_DOWNLOAD_COMPLETE这个广播,并传递downloadId作为参数。通过接受广播我们可以打开对下载完成的内容进行操作。代码如下:

@Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
            long downloadApkId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            if (downloadApkId > -1) {
                //installApk(context, downloadApkId);
            }
        }
    }

6 响应通知栏点击
(1) 响应下载中通知栏点击
点击下载中通知栏提示,系统会对下载的应用单独发送Action为DownloadManager.ACTION_NOTIFICATION_CLICKED广播。intent.getData为content://downloads/all_downloads/29669,最后一位为downloadId。
如果同时下载多个应用,intent会包含DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS这个key,表示下载的的downloadId数组。

(2) 响应下载完成通知栏点击
下载完后会调用下面代码进行处理,从中我们可以发现系统会调用View action根据mimeType去查询。所以可以利用我们在介绍的DownloadManager.Request的setMimeType函数。
openDownload源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值