【问题标题】:DownloadManager.addCompletedDownload() deprecated on Android QAndroid Q 不推荐使用 DownloadManager.addCompletedDownload()
【发布时间】:2019-12-15 09:53:58
【问题描述】:

在最近升级到 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 的替换吗?

【问题讨论】:

  • 我假设您使用MediaStore.Downloads 与使用MediaStore.Videos 的方式相同:insert() 元数据,然后使用Uri 写出文件。 This sample app 对视频内容执行此操作。

标签: android android-download-manager


【解决方案1】:

更新

在 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");
        }
    }
}

【讨论】:

  • Point 1. 通知不再显示 => 你可以调用类似context.sendBroadcast(new Intent(Intent.ActionMediaScannerFinished, uri));的广播
  • 糟糕的解决方案:/插入方法不起作用。无法访问直接路径。 Environment.DIRECTORY_DOWNLOADS + File.separator + "Temp" 不正确。
猜你喜欢
  • 2019-10-21
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
相关资源
最近更新 更多