Téléchargement d'un fichier sur Android : de l'idée au code fonctionnel
\n\nTout développeur Android est tôt ou tard confronté à la tâche de télécharger un fichier depuis le réseau. Cela peut être une mise à jour d'application, le téléchargement d'une image, d'un document PDF ou d'un morceau de musique. Mais simplement télécharger un fichier n'est que la moitié du travail. L'utilisateur doit voir que le processus est en cours : combien a été téléchargé, combien il reste, et que l'application ne s'est pas figée.
\n\nDans cet article, nous allons analyser une question classique de Stack Overflow qui a recueilli des milliers de vues : comment télécharger un fichier sur Android et afficher la progression dans une boîte de dialogue. Nous écrirons le code en Java, en utilisant AsyncTask et ProgressDialog (bien que dans les projets modernes, ils soient souvent remplacés par des coroutines ou RxJava, comprendre les classiques est une base qui n'a pas disparu).
Prêts ? C'est parti !
\n\nPourquoi est-ce si compliqué ? Trois pièges du téléchargement sur Android
\n\nÀ première vue, la tâche est simple : ouvrir une connexion, lire le flux d'octets, écrire dans un fichier. Mais en pratique, les développeurs butent sur trois choses :
\n\n- \n
- Le thread UI est bloqué — si vous lancez le téléchargement dans le thread principal, l'application se « fige » et Android affiche une boîte de dialogue « L'application ne répond pas ». \n
- La progression ne se met pas à jour — même si vous comptez les octets, vous ne pouvez pas simplement modifier l'UI depuis un thread d'arrière-plan. \n
- La configuration change — l'utilisateur a tourné l'écran, et votre
Activitya été recréée. La boîte de dialogue a disparu, et le téléchargement continue dans le vide. \n
Nous allons résoudre ces trois problèmes. Commençons par l'architecture, puis écrivons le code.
\n\nChoisir les outils : AsyncTask et ProgressDialog
\n\nÀ des fins éducatives, nous utilisons l'approche classique :
\n- \n
AsyncTask— pour effectuer le travail en arrière-plan et publier la progression. \n ProgressDialog— pour afficher les pourcentages. \n HttpURLConnection— pour la requête HTTP (elle est toujours vivante, bien que dépréciée). \n
Important : Dans les projets réels aujourd'hui, on utilise plutôt DownloadManager, WorkManager ou des bibliothèques comme Retrofit + OkHttp. Mais comprendre comment fonctionne le téléchargement « à la main » est un must-have pour tout développeur.
Code complet : téléchargement de fichier avec ProgressDialog
\n\nCi-dessous se trouve une classe prête à l'emploi pour le téléchargement. Le code est commenté en français pour que vous compreniez immédiatement ce qui se passe.
\n\nimport android.app.ProgressDialog;\nimport android.content.Context;\nimport android.os.AsyncTask;\nimport android.os.Environment;\nimport android.widget.Toast;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.InputStream;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\n\npublic class DownloadFileTask extends AsyncTask<String, Integer, String> {\n\n private Context context;\n private ProgressDialog progressDialog;\n\n public DownloadFileTask(Context context) {\n this.context = context;\n }\n\n @Override\n protected void onPreExecute() {\n super.onPreExecute();\n // Créer et afficher la boîte de dialogue de progression\n progressDialog = new ProgressDialog(context);\n progressDialog.setTitle("Téléchargement du fichier");\n progressDialog.setMessage("Téléchargement en cours...");\n progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);\n progressDialog.setCancelable(false); // Empêcher la fermeture accidentelle\n progressDialog.show();\n }\n\n @Override\n protected String doInBackground(String... params) {\n String fileUrl = params[0];\n String fileName = "fichier_telecharge.pdf"; // Peut être passé en second paramètre\n InputStream inputStream = null;\n FileOutputStream outputStream = null;\n\n try {\n // 1. Établir la connexion\n URL url = new URL(fileUrl);\n HttpURLConnection connec