我的下载代码存储必须“生存”到应用程序卸载的图像,我使用过 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 返回)