Отображаем процесс скачивание файла в ProgressDialog в Android

 Чтобы скачать файл в Android-приложении и отобразить прогресс в ProgressDialog, можно использовать Kotlin Coroutines с библиотекой OkHttp для загрузки и ProgressDialog для отображения прогресса. Вот пошаговая инструкция:

1. Добавление зависимостей

Сначала добавьте необходимые зависимости для OkHttp в файл build.gradle:

implementation 'com.squareup.okhttp3:okhttp:4.9.2'

2. Создание макета

В макете вашего Activity не нужно добавлять что-то специфическое для ProgressDialog, так как это модальный диалог, который отображается поверх вашего пользовательского интерфейса.

3. Реализация кода

Вот пример кода, который показывает, как настроить задачу загрузки с отслеживанием прогресса, используя Kotlin Coroutines:

import android.app.ProgressDialog
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.*
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.ResponseBody
import java.io.File
import java.io.FileOutputStream
import java.io.InputStream

class DownloadActivity : AppCompatActivity() {

    private val downloadUrl = "https://example.com/file.zip"
    private lateinit var progressDialog: ProgressDialog
    private val client = OkHttpClient()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Инициализация ProgressDialog
        progressDialog = ProgressDialog(this).apply {
            setMessage("Загрузка...")
            setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
            setCancelable(false)
            max = 100
        }

        // Начало загрузки
        downloadFile(downloadUrl)
    }

    private fun downloadFile(url: String) {
        progressDialog.show()
        CoroutineScope(Dispatchers.IO).launch {
            try {
                val request = Request.Builder().url(url).build()
                val response = client.newCall(request).execute()

                if (response.isSuccessful) {
                    response.body?.let { responseBody ->
                        saveFile(responseBody)
                    }
                } else {
                    // Обработка ошибки
                }
            } catch (e: Exception) {
                e.printStackTrace() // Обработка исключений
            }
        }
    }

    private suspend fun saveFile(body: ResponseBody) {
        val file = File(getExternalFilesDir(null), "downloaded_file.zip")
        val totalSize = body.contentLength()
        var downloadedSize: Long = 0

        body.byteStream().use { inputStream ->
            FileOutputStream(file).use { outputStream ->
                val buffer = ByteArray(1024)
                var bytesRead: Int

                while (inputStream.read(buffer).also { bytesRead = it } != -1) {
                    downloadedSize += bytesRead
                    outputStream.write(buffer, 0, bytesRead)
                    updateProgress(downloadedSize, totalSize)
                }

                outputStream.flush()
            }
        }

        withContext(Dispatchers.Main) {
            progressDialog.dismiss()
        }
    }

    private suspend fun updateProgress(downloadedSize: Long, totalSize: Long) {
        val progress = (downloadedSize * 100 / totalSize).toInt()
        withContext(Dispatchers.Main) {
            progressDialog.progress = progress
        }
    }
}

4. Объяснение

  • ProgressDialog: Отображает прогресс загрузки. Установлен в горизонтальный режим (STYLE_HORIZONTAL).
  • Kotlin Coroutines: Используются для выполнения задачи загрузки в фоновом потоке (Dispatchers.IO) и обновления интерфейса в основном потоке.
  • OkHttp: Используется для выполнения HTTP-запроса на загрузку.
  • Запись файла: Данные из ответа записываются в файл на диск с отслеживанием прогресса загрузки.

5. Разрешения

Не забудьте добавить необходимые разрешения в ваш AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Примечания:

  1. Обработка разрешений: Начиная с Android 6.0 (API 23), вам нужно запрашивать разрешение на WRITE_EXTERNAL_STORAGE во время выполнения, если ваша целевая версия SDK 23 или выше.
  2. ProgressDialog в настоящее время считается устаревшим. Для более современных интерфейсов рекомендуется использовать ProgressBar вместо ProgressDialog.

Эта реализация будет обрабатывать загрузку файла и отображать прогресс через ProgressDialog. Вы можете заменить ProgressDialog на более современный компонент интерфейса при необходимости.