Назад к вопросам
Middle
68
questionbank
Как бы вы реализовали возможность загрузки и просмотра файлов с сервера?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Для загрузки файла использовал бы Retrofit с корутинами или Flow.
interface FileApi {
@Streaming
@GET("/files/{fileName}")
suspend fun downloadFile(@Path("fileName") fileName: String): ResponseBody
}
В ViewModel или Interactor:
susțin fun downloadAndSaveFile(fileName: String): Result<File> {
return try {
val response = fileApi.downloadFile(fileName)
if (response.isSuccessful) {
val body = response.body() ?: throw IOException("Response body is null")
val file = File(context.filesDir, fileName)
body.byteStream().useிட்டு(FileOutputStream(file)) { input, output ->
input.copyTo(output)
}
Result.success(file)
} else {
Result.failure(IOException("File download failed: ${response.code()}"))
}
} catch (e: Exception) {
Result.failure(e)
}
}
Для отображения файла:
- Изображения:
ImageView, библиотеки типа Coil или Glide. - Текст:
TextView,EditText(для большого текста). - PDF: сторонние библиотеки (
PdfRendererиз Android SDK, MuPDF, PdfViewer library). - Видео/аудио:
MediaPlayer, ExoPlayer. - Общие: Системный Intent
ACTION_VIEWс URI файла.
Пример открытия PDF:
fun viewPdf(file: File) {
val uri = FileProvider.getUriForFile(context, "${context.packageName}.provider", file)
val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri, "application/pdf")
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
}
try {
context.startActivity(intent)
} catch (e: ActivityNotFoundException) {
// Обработка ситуации, когда не найдено приложение для открытия PDF
Toast.makeText(context, "No PDF viewer app found", Toast.LENGTH_SHORT).show()
}
}
Необходимо добавить FileProvider в AndroidManifest.xml и создать XML-файл с путями.
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
res/xml/file_paths.xml:
<paths>
<files-path name="my_files" path="/" />
</paths>