【问题标题】:The file is saved but not showing with ACTION_GET_CONTENT or ACTION_OPEN_DOCUMENT文件已保存但未显示 ACTION_GET_CONTENT 或 ACTION_OPEN_DOCUMENT
【发布时间】:2023-02-06 16:09:18
【问题描述】:

我使用 Retrofit 下载文件并将其保存在下载目录的子文件夹中。

当我检查手机的文件管理器时,它已正确下载并保存。例如,在以下路径中: Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + "/MyApp"

但是当我以 ACTION_GET_CONTENT 或 ACTION_OPEN_DOCUMENT 之类的意图打开文件管理器时,下载的文件不可见。 此外,如果我通过手机的文件管理器重命名文件或复制粘贴,所有内容都会固定在同一路径中

另外,保存在下载文件夹中没有任何问题 但是当创建子文件夹并且应该将其保存在那里时,会出现此问题

用下载管理器下载没有问题,但是我想用retrofit

下载功能:

    suspend fun download(url: String, targetPath: String, progressRetrofit: RetrofitProgress) = flow {
    try {
        val response = apiService.download(url).awaitResponse()
        val body = response.body()
        if (response.isSuccessful && body != null) {
            try {
                val file = File(targetPath)
                body.byteStream().use { inputStream ->
                    FileOutputStream(file).use { outputStream ->
                        val data = ByteArray(1024)
                        var read: Int
                        var currentDownloadSize = 0L
                        val fileSize = body.contentLength()
                        while (inputStream.read(data).also { read = it } != -1) {
                            outputStream.write(data, 0, read)
                            currentDownloadSize += read
                            withContext(Dispatchers.Main)
                            {
                                progressRetrofit.onProgressUpdate((currentDownloadSize * 100 / fileSize).toInt(), fileSize, currentDownloadSize)
                            }
                        }
                        withContext(Dispatchers.Main)
                        {
                            progressRetrofit.onProgressUpdate((currentDownloadSize * 100 / fileSize).toInt(), fileSize, currentDownloadSize)
                        }
                        outputStream.close()
                        outputStream.flush()
                    }
                }
                emit(NetworkResult.Success(true))
            } catch (e: Exception) {
                emit(NetworkResult.Failure(e.message.toString()))
                errorMessage(e.message.toString(), true)
            }
        } else {
            emit(NetworkResult.Failure(response.message()))
            errorMessage(response.errorBody().toString(), true)
        }
    } catch (e: Exception) {
        emit(NetworkResult.Failure(e.message.toString()))
        errorMessage(e.message.toString(), true)
    }
}

【问题讨论】:

  • 请在您想共享文件的地方共享代码。

标签: android kotlin download retrofit storage


【解决方案1】:

从 Android 6.0 开始,文件共享行为中有 bunch of changes

请查看FileProvider 并通过官方 android 文档中的 API 更改进一​​步查看。

如果您的代码中没有额外的细节,甚至没有可重现的代码示例,我也无能为力。

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2020-04-03
    • 2018-01-10
    • 2020-07-08
    相关资源
    最近更新 更多