@Override public List<DownloadJob> getAllDownloads() { List<DownloadJob> all = new ArrayList<DownloadJob>(); if (mDb != null) { Cursor query = mDb.query(DOWNLOAD_TABLE, null, null, null, null, null, null); DownloadJob job = null; try { for (query.moveToFirst(); !query.isAfterLast(); query.moveToNext()) { String aid = query.getString(query.getColumnIndex(COLUMN_AID)); String vid = query.getString(query.getColumnIndex(COLUMN_VID)); // 是否同一个part if (job == null || !job.getEntry().aid.equals(aid) || !job.getEntry().part.vid.equals(vid)) { job = buildJob(query); all.add(job); } VideoSegment s = new VideoSegment(); s.num = query.getInt(query.getColumnIndex(COLUMN_NUM)); s.size = query.getLong(query.getColumnIndex(COLUMN_TOTAL)); s.stream = query.getString(query.getColumnIndex(COLUMN_URL)); s.etag = query.getString(query.getColumnIndex(COLUMN_ETAG)); s.fileName = query.getString(query.getColumnIndex(COLUMN_DATA)); s.duration = query.getLong(query.getColumnIndex(COLUMN_DURATION)); job.getEntry().part.segments.add(s); if (AcApp.isExternalStorageAvailable()) { if (!TextUtils.isEmpty(job.getEntry().destination) && !TextUtils.isEmpty(s.fileName)) { // 设置segment的播放路径为本地文件uri // 实现边下边播的功能 File file = new File(job.getEntry().destination, s.fileName); if (file.exists()) { s.url = Uri.fromFile(file).toString(); } else s.url = s.stream; int downloadedSize = (int) file.length(); job.addDownloadedSize(downloadedSize); if (query.getInt(query.getColumnIndex(COLUMN_CURRENT)) != downloadedSize) { // 数据库中的数据有误! // 写入正确的数据 // XXX: 也许根本就不需要current_bytes这个字段... ContentValues values = new ContentValues(); values.put(COLUMN_CURRENT, downloadedSize); updateDownload(job.getEntry().part.vid, s.num, values); } } } // 真实的下载进度由file.length来确定比较好。 // @see downloadTask.setupDestinationFile() // int downloadedSize = query.getInt(query.getColumnIndex(COLUMN_CURRENT)); // job.addDownloadedSize(downloadedSize); int totalSize = query.getInt(query.getColumnIndex(COLUMN_TOTAL)); if (totalSize != -1) job.addTotalSize(totalSize); } } catch (Exception e) { } finally { query.close(); } } return all; }