【发布时间】: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