6

我的下载代码存储必须“生存”到应用程序卸载的图像,我使用过 getExternalStoragePublicDirectory,但现在在 Android Q 上这个 API 已被弃用,所以我修改了我的下载代码

val uri = Uri.fromFile(File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES), "mysubdir"))
val request = DownloadManager.Request(Uri.parse(url))
.setDestinationUri(uri)

val uri = buildImageUri(context.contentResolver, fileName, fileName)
val request = DownloadManager.Request(Uri.parse(url))
    .setDestinationUri(uri)

////// Use MediaStore

    fun buildImageUri(
        cr: ContentResolver,
        title: String,
        description: String): Uri? {
        val values = ContentValues()
        values.put(MediaStore.Images.Media.TITLE, title)
        values.put(MediaStore.Images.Media.DISPLAY_NAME, title)
        values.put(MediaStore.Images.Media.DESCRIPTION, description)
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
        val buildTime = System.currentTimeMillis() / 1000
        values.put(MediaStore.Images.Media.DATE_ADDED, buildTime)
        values.put(MediaStore.Images.Media.DATE_MODIFIED, buildTime)

        return cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
    }

但是我java.lang.IllegalArgumentException: Not a file URI: null知道如何编写代码以符合 Android Q 并且不使用诸如在 uri 中搜索冒号和拆分字符串之类的深奥技巧?

setDestinationUri的文档未更新并说

对于面向 Build.VERSION_CODES.Q 或更高版本的应用程序, 省略文本或顶级下载目录中的路径(由 Environment#getExternalStoragePublicDirectory(String) 和 Environment#DIRECTORY_DOWNLOADS 返回)

4

1 回答 1

12

DownloadManagerfile:仍然存在仅支持方案的长期限制,而不是content:. 我提出了一个问题,试图在某一天纠正这个问题。

您的选择是:

  • 使用setDestinationInExternalFilesDir()on DownloadManager.Request,它映射到getExternalFilesDir(),您的应用程序可以完全访问它。如果内容应该在应用程序卸载后仍然存在,您需要将其用作临时位置,然后自己将内容移动到另一个更持久的位置。

  • setDestinationInExternalPublicDir()上使用DownloadManager.Request。虽然不推荐使用相应的位置 ( Environment.getExternalStoragePublicDirectory()),但这并不妨碍您使用DownloadManager它。可能存在的问题是,一旦您的应用采用 Android Q 的范围存储,您将无法读取或写入下载的文件,因为您无权访问此目录。因此,这仅适用于“盲”下载,您的应用程序根据用户请求下载某些内容,但只有用户(而不是应用程序)需要访问下载的内容。

  • 使用setDestinationUri()on表示一些其他有用的位置DownloadManager.Requestfile: Uri例如,可能(虽然有点奇怪)想要下载到getExternalCacheDir().

于 2019-06-09T19:01:02.050 回答