【问题标题】:Saving Files in Downloads Folder of Shared External Storage将文件保存在共享外部存储的下载文件夹中
【发布时间】:2021-01-28 09:12:28
【问题描述】:

我想将文件保存到 Android 外部存储的下载文件夹中。当我将它存储在共享公共存储中并且我不想将它保存在内部存储(范围存储)中时,我该怎么做?我问这个是因为 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) 似乎已被弃用,我想做一些类似的事情,它也支持 Android 11。

【问题讨论】:

  • 如果您不需要自动执行此操作,您可以允许用户决定保存此显示保存文件对话框的位置。

标签: android


【解决方案1】:

例如,您可以使用具有此类文件夹路径的系统下载管理器:

Environment.DIRECTORY_DOWNLOADS

如您所知,您必须添加所需/建议的文件名。所以结果你会得到这样的函数调用:

.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)

您可以在下面看到我使用此类系统功能的一些示例:

val link = ""
 val request = DownloadManager.Request(Uri.parse(link))
 .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
.setMimeType(MimeTypeMap.getFileExtensionFromUrl(link))
.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE or DownloadManager.Request.NETWORK_WIFI)

.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName)

val manager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
val downloadId = manager.enqueue(request)
val query = DownloadManager.Query().setFilterById(downloadId)

var downloading = true
while (downloading) {
       val cursor: Cursor = manager.query(query)
        cursor.moveToFirst()
        if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
         downloading = false
          Toast.makeText(context, context.resources.getString(R.string.download_file_message, fileName), Toast.LENGTH_SHORT).show()
       }
    cursor.close()
  }

如果需要,您还可以添加一些标题:

.addRequestHeader("header name", "")

我希望它能帮助你并解决你的任务:)

【讨论】:

  • 您的代码确实会进行下载。但是var downloading = true while (downloading).... 会阻止 gui。该通知将已通知用户。其余的你最好实现一个广播接收器。而且... OP没有谈到下载。仅关于存储。好吧,让我们看看...
  • 是的,你的想法也不错)而且你是对的——我的代码块 gui。我会尝试添加接收器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多