一、所需权限
<uses-permission android:name="android.permission.INTERNET" />
<!--如果下载的文件是apk,下载完安装需要该权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
二、简介
DownloadManager是Android提供的一个系统服务,通过这个服务,我们可以将下载文件的任务委托给系统进行,无需我们做太多的工作。
三、使用
1.创建
val request = DownloadManager.Request(Uri.parse(url))
//设置允许使用的网络类型
.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE)
//设置允许漫游
.setAllowedOverRoaming(true)
//设置文件格式
.setMimeType(mimeType)
//设置通知显示的时机
// -下载中展示 VISIBILITY_VISIBLE(默认)
// -下载中和完成时展示 VISIBILITY_VISIBLE_NOTIFY_COMPLETED
// -下载完成时展示 VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION
// -不展示 VISIBILITY_HIDDEN
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE)
//设置通知的标题
.setTitle(getFileName(url))
//设置通知的描述信息
.setDescription(LOADING_TEXT).also {
//设置下载地址
context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)?.mkdirs()
it.setDestinationInExternalFilesDir(
context,
Environment.DIRECTORY_DOWNLOADS,
getFileName(url)
)
}
downloadId = downloadManager?.enqueue(request)!!
2.注册广播,监听下载状态
val intentFilter = IntentFilter()
intentFilter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
intentFilter.addAction(DownloadManager.ACTION_VIEW_DOWNLOADS)
intentFilter.addAction(DownloadManager.ACTION_NOTIFICATION_CLICKED)
val downLoadReceiver = DownLoadReceiver()
context.registerReceiver(downLoadReceiver, intentFilter)
下载完成时,发送的广播。
对应的Action为:ACTION_DOWNLOAD_COMPLETE
下载过程中Notification被点击时发送的广播。
对应的Action为:ACTION_NOTIFICATION_CLICKED
查看所有下载情况的广播。
对应的Action为:ACTION_VIEW_DOWNLOADS
3.完整代码
以apk下载为例,下载完成后自动安装
package com.mine.common.tools
import android.Manifest
import android.app.DownloadManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.Settings
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompat