安卓 w=10=us
AndroidQ DownloadManager.Request.setDestinationUri
我的下载代码存储了必须 'survive' 才能卸载应用程序的图像,我使用 getExternalStoragePublicDirectory
,但现在 Android 问这个 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 的文档未更新并说
For applications targeting Build.VERSION_CODES.Q or above,
omissimis text or a path within the top-level Downloads directory (as
returned by Environment#getExternalStoragePublicDirectory(String) with
Environment#DIRECTORY_DOWNLOADS)
DownloadManager
仍然有其 long-standing 仅支持 file:
方案的限制,而不是 content:
。我提交 an issue 试图在某天更正此问题。
您的选择是:
在 DownloadManager.Request
上使用 setDestinationInExternalFilesDir()
,它映射到 getExternalFilesDir()
,您的应用可以完全访问它。如果内容在应用程序卸载后仍然存在,您需要将其用作临时位置并自行将内容移动到另一个更持久的位置。
在 DownloadManager.Request
上使用 setDestinationInExternalPublicDir()
。虽然相应的位置 (Environment.getExternalStoragePublicDirectory()
) 已弃用,但这并不妨碍您对其使用 DownloadManager
。 可能 的问题是,一旦您的应用采用 Android Q's,您将无法读取或写入下载的文件,因为您无权访问此目录范围存储。因此,这仅适用于 "blind" 下载,您的应用程序根据用户请求下载某些内容,但只有用户(而不是应用程序)需要访问下载的内容。
在 DownloadManager.Request
上使用 setDestinationUri()
表示一些 file:
Uri
代表其他一些有用的位置。例如,可能(虽然有点奇怪)想要下载到 getExternalCacheDir()
.
我的下载代码存储了必须 'survive' 才能卸载应用程序的图像,我使用 getExternalStoragePublicDirectory
,但现在 Android 问这个 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 的文档未更新并说
For applications targeting Build.VERSION_CODES.Q or above, omissimis text or a path within the top-level Downloads directory (as returned by Environment#getExternalStoragePublicDirectory(String) with Environment#DIRECTORY_DOWNLOADS)
DownloadManager
仍然有其 long-standing 仅支持 file:
方案的限制,而不是 content:
。我提交 an issue 试图在某天更正此问题。
您的选择是:
在
DownloadManager.Request
上使用setDestinationInExternalFilesDir()
,它映射到getExternalFilesDir()
,您的应用可以完全访问它。如果内容在应用程序卸载后仍然存在,您需要将其用作临时位置并自行将内容移动到另一个更持久的位置。在
DownloadManager.Request
上使用setDestinationInExternalPublicDir()
。虽然相应的位置 (Environment.getExternalStoragePublicDirectory()
) 已弃用,但这并不妨碍您对其使用DownloadManager
。 可能 的问题是,一旦您的应用采用 Android Q's,您将无法读取或写入下载的文件,因为您无权访问此目录范围存储。因此,这仅适用于 "blind" 下载,您的应用程序根据用户请求下载某些内容,但只有用户(而不是应用程序)需要访问下载的内容。在
DownloadManager.Request
上使用setDestinationUri()
表示一些file:
Uri
代表其他一些有用的位置。例如,可能(虽然有点奇怪)想要下载到getExternalCacheDir()
.