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?

StackOverflow https://stackoverflow.com/questions/4866679

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 ....

Était-ce utile?

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

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top