如何使用Android存储访问框架将文件保存到下载文件夹?

5
我正在从服务器下载文件,并将其保存到Android的下载文件夹中,以下是使用下列方式访问文件路径以进行保存。
 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)

在Android Q中,已经弃用了该方法,因此我必须使用存储访问框架。

 fun downloadFile(url: String, originalFileName: String) {
    mDownloadDisposable.add(
            mRCloudRepository.downloadFile(url)
                    .flatMap(object : Function1<Response<ResponseBody>, Flowable<File>> {
                        override fun invoke(p1: Response<ResponseBody>): Flowable<File> {
                            return Flowable.create({
                                try {
                                    val file = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absoluteFile, originalFileName)
                                    val sink = file.sink().buffer() 
                                    sink.writeAll(p1.body()!!.source())
                                    sink.close()
                                    it.onNext(file)
                                    it.onComplete()
                                } catch (e: IOException) {
                                    e.printStackTrace()
                                    it.onError(e)
                                }
                            }, BackpressureStrategy.BUFFER)
                        }

                    })
                    .subscribeOn(mIoScheduler)
                    .observeOn(mUiScheduler)
                    .subscribe(
                            {
                                cancelNotification()
                                val contentIntent: PendingIntent = PendingIntent.getActivity(mContext, NotificationBuilder.NOTIFICATION_DOWNLOAD_ID, getOpenFileIntent(it), PendingIntent.FLAG_CANCEL_CURRENT)
                                NotificationBuilder.showDownloadedNotification(mContext!!, 2, "Downloaded $originalFileName ", "", contentIntent)
                            }, {
                        cancelNotification()
                        it.printStackTrace()
                    }
                    )
    )
}

有任何问题吗?有任何疑问吗?请在您的帖子中提供所有信息。 - blackapps
@blackapps 更新了问题。我想知道如何使用SAF将文件保存在下载文件夹中。 - Ashish singh
你应该在帖子中提出你的问题和疑问,而不是在评论中。当然也不应只放在主题中。 - blackapps
我想知道如何使用SAF将文件保存在下载文件夹中,但这是不可能的,因为您无法控制内容存储的位置。用户可以自行决定。使用“ACTION_CREATE_DOCUMENT”可以让用户控制用户设备或用户云服务上的用户位置,以便用户存储用户的内容。这可能与“下载”名称有关,也可能不是。 - CommonsWare
@CommonsWare .. 谢谢!我很好奇 Gmail 是如何直接将附件保存到下载文件夹的?没有任何弹出窗口来选择保存附件的位置吗?他们不使用 SAF 吗? - Ashish singh
显示剩余2条评论
1个回答

1

您可以在简单存储中尝试使用DocumentFileCompat#createDownloadWithMediaStoreFallback()

val uri = DocumentFileCompat.createDownloadWithMediaStoreFallback(applicationContext, FileDescription(filename))
val output = uri?.openOutputStream(applicationContext)
val input = // get input stream from Response<ResponseBody>
// then, write input stream to output stream

在Android 10中,访问Download目录中的文件需要使用URI,而不是直接文件路径。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接