在最近升级到API 29时,我的代码是
downloadManager.addCompletedDownload(downloadFilename,
downloadFilename, true, saveInfo.mimeType,
downloadPath, outputFile.length(), true)
…现在会产生弃用警告:
警告:'addCompletedDownload(String !, String !, Boolean,String !, String !, Long,Boolean):不建议使用Long'。在Java中已弃用
DownloadManager.addCompletedDownload的API文档说:
此方法在API级别29中已弃用。 应用程序应该将文件贡献给MediaStore.Downloads集合,以使用户可以将它们作为下载的一部分使用。
但是,我无法找到有关MediaStore.Downloads应该如何精确替代的代码示例。 MediaStore.Downloads文档基本上不存在,并且MediaStore文档没有提供明显的指导。
任何人都可以为上述代码提供API 29兼容的替代品吗?
答案 0 :(得分:3)
您必须更新MediaStore.Downloads
集合。这样,您的文件将在Downloads
文件夹中可见。在Android Q中,您不再需要更新DownloadManager
,而需要更新MediaStore.Downloads
集合。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// You can add more columns.. Complete list of columns can be found at
// https://developer.android.com/reference/android/provider/MediaStore.Downloads
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Downloads.TITLE, /* FILE_NAME */);
contentValues.put(MediaStore.Downloads.DISPLAY_NAME, /* DISPLAY NAME */);
contentValues.put(MediaStore.Downloads.MIME_TYPE, /* MIME TYPE */);
contentValues.put(MediaStore.Downloads.SIZE, /* FILE SIZE */);
// If you downloaded to a specific folder inside "Downloads" folder
contentValues.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS + File.separator + "Temp");
// Insert into the database
ContentResolver database = getContentResolver();
database.insert(Downloads.EXTERNAL_CONTENT_URI, contentValues);
} else {
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
if (downloadManager != null) {
downloadManager.addCompletedDownload(downloadFilename, downloadFilename, true,
saveInfo.mimeType, downloadPath, outputFile.length(), true)
}
}
注意以下差异
这是一小块盐,因为我还在检查以下几点:
1-不再显示通知。我想您现在有责任立即通知用户。
2-{{1}}集合仅接受“ / Downloads”文件夹下的文件。因此,这可能会影响下载位置。
要确认插入位置等,可以按以下步骤转储数据库:
MediaStore.Downloads