android - DownloadManager.addCompletedDownload() 在 Android Q 上已弃用

标签 android android-download-manager

关于最近升级到 API 29,我的代码:

downloadManager.addCompletedDownload(downloadFilename,
    downloadFilename, true, saveInfo.mimeType,
    downloadPath, outputFile.length(), true)

…现在产生弃用警告:

Warning: 'addCompletedDownload(String!, String!, Boolean, String!, String!, Long, Boolean): Long' is deprecated. Deprecated in Java

DownloadManager.addCompletedDownload 的 API 文档说:

This method was deprecated in API level 29. Apps should instead contribute files to MediaStore.Downloads collection to make them available to user as part of Downloads.

但是,我一直无法找到一个代码示例来说明如何使用 MediaStore.Downloads 作为替代品。 MediaStore.Downloads文档基本上不存在,MediaStore文档没有提供明显的指导。

谁能为上述代码提供符合 API 29 标准的替代品?

最佳答案

更新

在 Android 10 (Q) 中,您必须使用 MediaStore 概念。 我做了一些测试,似乎使用下载管理器下载的文件(并存储在默认的“下载”文件夹中)会自动添加到 MediaStore.Downloads 数据库中。因此,您不需要像我在下面描述的那样手动添加它们。对于任何情况,下面都有一段代码,您可以在其中将数据插入 MediaStore.Downloads

原始答案

您必须更新 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 - MediaStore.Downloads 集合仅接受“/Downloads”文件夹下的文件。因此,这会影响下载位置。

要确认插入的位置等,您可以按如下方式转储数据库:

public void dumpDb() {
    DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
    if (downloadManager != null) {
        Cursor cursor = downloadManager.query(new DownloadManager.Query());
        Log.e("TESTS", "DownloadManager dump start");
        while(cursor.moveToNext()) {
            Log.e("TESTS", "Title: " + cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE))
                    + " status: " + cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))
                    + " id: " + cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID)));
        }
        Log.e("TESTS", "DownloadManager dump end");
        cursor.close();
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        ContentResolver contentResolver = getContentResolver();
        if (contentResolver != null) {
            Cursor cursor = contentResolver.query(Downloads.EXTERNAL_CONTENT_URI, null, null, null);
            Log.e("TESTS", "MediaStore Collection Dump start");
            if (cursor != null) {
                Log.e("TESTS", DatabaseUtils.dumpCursorToString(cursor));
                cursor.close();
            }

            Log.e("TESTS", "MediaStore Collection Dump end");
        }
    }
}

关于android - DownloadManager.addCompletedDownload() 在 Android Q 上已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57399849/

相关文章:

android - 如何检测android在adb中完成下载?

使用 DownloadManager 时 ListView 中的 Android ProgressBar

android - 如何从一个 Activity 中完成一系列开放的子 Activity ?

java - 如何在 Firestore 中保存时间戳?

android - 应用程序安装日期

android - 多人等候室超过 2 名玩家时不显示已连接的玩家

android - 用于在 android 中取消下载的广播接收器

java - Android 下载管理器 - 无法知道下载的大小

android - 实现后是否可以在谷歌开发者控制台上重命名发布包?

java - WebView 无法从 wordpress 网站下载媒体(POST)