由于项目需要,用到了 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源码