AndroidQ DownloadManager.Request.setDestinationUri

daf*_*afi 6 android android-10.0

我的下载代码存储了必须“存活”才能卸载应用程序的图像,我使用过 getExternalStoragePublicDirectory,但现在在 Android Q 上此 API 已弃用,因此我修改了下载代码

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

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)
    }
Run Code Online (Sandbox Code Playgroud)

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

setDestinationUri的文档未更新并说

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

Com*_*are 11

DownloadManager仍然有其长期的限制,即仅支持file:计划,而不是content:. 我提出了一个问题,试图在某一天纠正这个问题

您的选择是:

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

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

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