package com.ydl.ydlcommon.utils import android.app.DownloadManager import android.content.Context import android.net.Uri import java.io.File /** * 使用系统下载服务下载文件 */ class SystemDownloadFileUtil(var context : Context){ var fileUrl : String? = null var mTitle : String? = null var desc : String? = null var mVersion : String? = null companion object { private var systemDownloadFileUtil : SystemDownloadFileUtil? = null @Synchronized fun getInstances(context: Context): SystemDownloadFileUtil { return systemDownloadFileUtil ?: SystemDownloadFileUtil(context) } } fun setUrl(str : String?): SystemDownloadFileUtil { this.fileUrl = str return this } fun setTitle(str : String?){ this.mTitle = str } fun setVersion(ver:String?): SystemDownloadFileUtil { this.mVersion = ver return this } fun start():Long{ fileUrl?:return 0 val request = DownloadManager.Request(Uri.parse(fileUrl)) /* * 设置在通知栏是否显示下载通知(下载进度), 有 3 个值可选: * VISIBILITY_VISIBLE: 下载过程中可见, 下载完后自动消失 (默认) * VISIBILITY_VISIBLE_NOTIFY_COMPLETED: 下载过程中和下载完成后均可见 * VISIBILITY_HIDDEN: 始终不显示通知 */ request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // 设置通知的标题和描述 request.setTitle(mTitle) request.setDescription(desc) // 设置下载文件的保存位置 val saveFile = File(FileUtil2.getLocalStorePath("download"), "ydl-user-$mVersion.apk") request.setDestinationUri(Uri.fromFile(saveFile)) /* * 2. 获取下载管理器服务的实例, 添加下载任务 */ val manager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager // 将下载请求加入下载队列, 返回一个下载ID val downloadId = manager.enqueue(request) return downloadId } fun query(downloadId: Long?) { downloadId?:return // 获取下载管理器服务的实例 val manager =context.getSystemService (Context.DOWNLOAD_SERVICE) as DownloadManager // 创建一个查询对象 var query = DownloadManager.Query() // 根据 下载ID 过滤结果 query.setFilterById(downloadId) // 还可以根据状态过滤结果 // query.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL); // 执行查询, 返回一个 Cursor (相当于查询数据库) var cursor = manager.query(query) if (!cursor.moveToFirst()) { cursor.close() return } // 下载ID var id = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID)) // 下载请求的状态 var status = cursor.getInt (cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) // 下载文件在本地保存的路径(Android 7.0 以后 COLUMN_LOCAL_FILENAME 字段被弃用, 需要用 COLUMN_LOCAL_URI 字段来获取本地文件路径的 Uri) val localFilename = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)) // 已下载的字节大小 var downloadedSoFar = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)) // 下载文件的总字节大小 var totalSize = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)) cursor.close() // System.out.println("下载进度: " + downloadedSoFar + "/" + totalSize); /* * 判断是否下载成功,其中状态 status 的值有 5 种: * DownloadManager.STATUS_SUCCESSFUL: 下载成功 * DownloadManager.STATUS_FAILED: 下载失败 * DownloadManager.STATUS_PENDING: 等待下载 * DownloadManager.STATUS_RUNNING: 正在下载 * DownloadManager.STATUS_PAUSED: 下载暂停 */ if (status == DownloadManager.STATUS_SUCCESSFUL) { /* * 特别注意: 查询获取到的 localFilename 才是下载文件真正的保存路径,在创建 * 请求时设置的保存路径不一定是最终的保存路径,因为当设置的路径已是存在的文件时, * 下载器会自动重命名保存路径,例如: .../demo-1.apk, .../demo-2.apk */ // System.out.println("下载成功, 打开文件, 文件路径: " + localFilename); } } fun cancel(downLoadId : Long?){ downLoadId?:return val manager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager manager.remove(downLoadId) } }