首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AndroidQ DownloadManager.Request.setDestinationUri

AndroidQ DownloadManager.Request.setDestinationUri
EN

Stack Overflow用户
提问于 2019-06-07 12:22:09
回答 1查看 2.7K关注 0票数 6

我的下载代码存储了必须‘存活’才能卸载应用程序的图片,我使用的是getExternalStoragePublicDirectory,但现在在Android Q上这个接口被弃用了,所以我修改了我的下载代码

代码语言:javascript
复制
val uri = Uri.fromFile(File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES), "mysubdir"))
val request = DownloadManager.Request(Uri.parse(url))
.setDestinationUri(uri)

代码语言:javascript
复制
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#DIRECTORY_DOWNLOADS)

的Environment#getExternalStoragePublicDirectory(String)返回

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-10 03:01:02

DownloadManager仍然有其长期存在的限制,即只支持file:方案,而不支持content:。我提交了an issue,希望有一天能纠正这一点。

您可以选择:

  • DownloadManager.Request上使用setDestinationInExternalFilesDir(),它映射到你的应用程序有权完全访问的getExternalFilesDir()。如果内容在卸载应用程序后仍然存在,则需要将其用作临时位置,并自行将内容移动到另一个更持久的位置。
  • DownloadManager.Request上使用setDestinationInExternalPublicDir()。虽然不推荐使用相应的位置(Environment.getExternalStoragePublicDirectory()),但这并不妨碍您对其使用DownloadManager。可能的问题是,一旦你的应用程序采用Android Q的作用域存储,你将无法读取或写入下载的文件,因为你没有访问此目录的权限。因此,这只适用于“盲目”下载,即你的应用程序根据用户请求下载内容,但只有用户(而不是应用程序)需要访问下载的内容。
  • 使用DownloadManager.Request上的setDestinationUri()来获取一些代表其他一些有用位置的file: Uri。例如,可以(尽管有点奇怪)想要下载到getExternalCacheDir().
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56487929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档