Назад к вопросам
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>