SystemDownloadFileUtil.kt 4.88 KB
Newer Older
1
package com.ydl.ydlcommon.utils
konghaorui committed
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

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)
        // 设置下载文件的保存位置
60
        val saveFile = File(FileUtil2.getLocalStorePath("download"), "ydl-user-$mVersion.apk")
konghaorui committed
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
        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)
    }
}