Télécharger le fichier de données 5-40 Mo dans Android 2.2 de l'URL. Quelles sont les classes à utiliser pour le développement?
-
28-10-2019 - |
Question
Je développe une application dans laquelle je dois télécharger un fichier (.zip / txt / .jpg, etc.) taille- 5 à 50 Mo .. application basée sur Android 2.2.
L'utilisateur fournit URL et déclenche le téléchargement mais le processus de téléchargement fonctionne en arrière-plan jusqu'à la fin.
le streaming doit être utilisé pour le téléchargement de fichiers.
Je veux savoir comment cela peut être fait en utilisant Connexions HTTP .
ce que les classes peuvent être utilisés pour cela?
Est-ce que Android 2.2 fournit une API pour cela?
Toute aide est appréciée ....
La solution
Android a fait inclure une API appelée DownloadManager
uniquement dans ce but ... mais il a été sortie en 2.3; si bien qu'il ne sera pas utile dans votre application cible 2.2, il pourrait encore être une bonne ressource pour vous à la recherche de la mise en œuvre.
Une implémentation simple que je recommande est quelque chose comme ceci:
- Utilisez un
HttpURLConnection
pour se connecter et télécharger les données. Cela nécessitera l'autorisation INTERNET à déclarer dans votre manifeste - Déterminez où vous voulez que le fichier soit. Si vous le souhaitez sur la carte SD de l'appareil, vous aurez également besoin de l'autorisation de WRITE_EXTERNAL_STORAGE.
- Wrap cette opération dans la méthode doInBackground () d'un
AsyncTask
. Ceci est une opération de longue durée, vous devez le mettre dans un fil d'arrière-plan, qui gère AsyncTask pour vous. - Mettre en œuvre ce dans un
Service
si l'opération pouvez exécuter protégé sans que l'utilisateur en gardant la une activité au premier plan. - Utilisez
NotificationManager
pour avertir l'utilisateur lorsque le téléchargement est terminé, qui affichera un message à leur barre d'état.
Pour simplifier les choses, si vous utilisez IntentService
, il traitera le filetage pour vous (tout onHandleIntent
est appelé sur un thread d'arrière-plan) et vous pouvez la queue plusieurs téléchargements pour qu'il puisse traiter un à la fois en envoyant simplement plusieurs intentions à elle. Voici un exemple squelette de ce que je dis:
public class DownloadService extends IntentService {
public static final String EXTRA_URL = "extra_url";
public static final int NOTE_ID = 100;
public DownloadService() {
super("DownloadService");
}
@Override
protected void onHandleIntent(Intent intent) {
if(!intent.hasExtra(EXTRA_URL)) {
//This Intent doesn't have anything for us
return;
}
String url = intent.getStringExtra(EXTRA_URL);
boolean result = false;
try {
URL url = new URL(params[0]);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
//Input stream from the connection
InputStream in = new BufferedInputStream(connection.getInputStream());
//Output stream to a file in your application's private space
FileOutputStream out = openFileOutput("filename", Activity.MODE_PRIVATE);
//Read and write the stream data here
result = true;
} catch (Exception e) {
e.printStackTrace();
}
//Post a notification once complete
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Notification note;
if(result) {
note = new Notification(0, "Download Complete", System.currentTimeMillis());
} else {
note = new Notification(0, "Download Failed", System.currentTimeMillis());
}
manager.notify(NOTE_ID, note);
}
}
Ensuite, vous pouvez appeler ce service avec l'URL que vous souhaitez télécharger ne importe où dans une activité comme ceci:
Intent intent = new Intent(this, DownloadService.class);
intent.putExtra(DownloadService.EXTRA_URL,"http://your.url.here");
startService(intent);
Hope qui est! Utile
EDIT: Je fixer cet exemple pour supprimer le double filetage inutile pour celui qui vient à plus tard
.