В моем коде загрузки хранятся изображения, которые должны «выжить» для удаления приложения, я использовал 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) с
Окружающая среда # DIRECTORY_DOWNLOADS)