Я загружаю файл с помощью Retrofit и сохраняю его в подпапке в каталоге загрузки.
когда я проверяю файловый менеджер телефона, он загружается и сохраняется правильно. Например, по следующему пути: Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + "/MyApp"
Но когда я открываю файловый менеджер с таким намерением, как ACTION_GET_CONTENT или ACTION_OPEN_DOCUMENT, загруженный файл не отображается. Кроме того, если я переименую файл или скопирую и вставлю через файловый менеджер телефона, все исправится по тому же пути
Кроме того, сохранение в папке загрузок выполняется без каких-либо проблем. Но когда создается подпапка и она должна быть сохранена там, возникает эта проблема
Нет проблем с загрузкой с помощью DownloadManager, но я хочу использовать переустановку
Функция загрузки:
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)
}
}
Я просто не верю вашему сценарию.
@Gleichmut Я не хочу делиться файлом. Я хочу просмотреть свой файл, когда я открываю хранилище через приложение. Средство выбора файлов Telegram тоже не находит мой файл, но мой файл существует и открывается.
@blackapps Файл хранится в подпапке загрузок, но его нельзя идентифицировать с помощью средства выбора файлов приложения. Но если я сохраню его в папке загрузок, файл будет идентифицирован с помощью средства выбора файлов. Это маловероятно???
@mahdi asd, поделитесь своим целевым SDK и тестовым устройством (поставщик, модель и версия Android). Не могли бы вы поделиться URL-адресом, где мы также можем скачать этот файл? Не могли бы вы подтвердить, что это поведение воспроизводится с любым другим файлом? Не могли бы вы подтвердить, что это поведение воспроизводится на эмуляторах Android 6 и Android 11?
@Gleichmut targetSdk — 32 И эта проблема существует на всех устройствах, включая эмуляторы и настоящие телефоны. Как Xiaomi Mi 8 Lite и Android 7, 11 и 12. И с каждым загруженным файлом, я думаю, проблема не связана с типом телефона, потому что нет проблем, когда мы сохраняем его в папке загрузок. Есть проблема при сохранении в подпапку. Даже этой проблемы не существует, когда это делается с помощью самого менеджера загрузок Android. Проблема не в том, как использовать Intent. Потому что Telegram не показывает файл в пути к подпапке.
the file will be identified with the file picker. Is this unbelivable???
Нет. Невероятно, что он НЕ был найден с помощью ACTION_GET_CONTENT и ACTION_OPEN_DOCUMENT, если этот файл действительно находится в этой подпапке общедоступного каталога загрузки.
Начиная с Android 6.0 есть куча изменений в поведении обмена файлами.
Пожалуйста, ознакомьтесь с FileProvider
и просмотрите изменения API в официальной документации Android, например. нравится это.
Без дополнительных деталей в вашем коде или даже воспроизводимого примера кода я не могу больше помочь.
Делитесь? Это касается ACTION_GET_CONTENT и ACTION_OPEN_DOCUMENT. Больше ничего.
Хммм...
Ты прав...
Бывает.
Но только если с ACTION_OPEN_DOCUMENT пользователь напрямую использует элемент Downloads
.
Вместо этого пользователь должен просмотреть устройство и перейти в каталог Download
, а затем в подкаталог.
(Примечание: первый заканчивается на s, реальный каталог без s.).
После еще нескольких тестов выяснилось, что файл сканировался MediaStore.
Поэтому добавьте несколько строк кода, чтобы его можно было отсканировать после загрузки.
Большое спасибо Это было абсолютной правдой. А с помощью MediaScannerConnection можно отображать файлы.
Пожалуйста, поделитесь кодом, где вы хотели бы поделиться своим файлом.