web-dev-qa-db-fra.com

Android DownloadManager obtenir le nom du fichier

Dans mon application, vous pouvez télécharger des fichiers. J'ai utilisé la classe Android DownloadManager pour le téléchargement. Une fois le téléchargement terminé, un message m'indiquant que le fichier a été téléchargé s'affiche. Le problème est qu'il pourrait y avoir 2, 3 ou 4 téléchargements en même temps. Mon code BroadcastReceiver ressemble à ceci:

receiver_complete = new BroadcastReceiver(){
         @Override
          public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
                if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE) ){
                    Toast.makeText(MainActivity.this, MainActivity.this.getString(R.string.download_finished, "Here should be the name", Toast.LENGTH_SHORT).show();
                }
         }
     };

Comment puis-je obtenir le nom de fichier actuel du téléchargement terminé?

Merci beaucoup.

22
user1456060

Je pense que vous voulez mettre quelque chose comme ceci dans votre bloc if. Remplacez YOUR_DM par votre instance DownloadManager.

Bundle extras = intent.getExtras();
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID));
Cursor c = YOUR_DM.query(q);

if (c.moveToFirst()) {
    int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
    if (status == DownloadManager.STATUS_SUCCESSFUL) {
        // process download
        title = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE));
        // get other required data by changing the constant passed to getColumnIndex
    }
}
20
Ian Shannon

Ian Shannon avait parfaitement raison avec sa réponse, mais j'avance un peu en amélioration:

  • N'oubliez pas de fermer cette Cursor après l'avoir utilisée, en évitant les "fuites de curseur". Cette Cursor consomme beaucoup de ressources et doit être publiée dès que possible. 

  • Si vous mettez un titre pour le téléchargement, tel que:

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
    request.setTitle("Some title");
    

    La valeur donnée par le DownloadManager.COLUMN_TITLE sera "Some title" au lieu du nom du fichier. Je recommanderais donc ceci à la place:

    String filePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
    title = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length() );
    

    Le COLUMN_LOCAL_FILENAME renvoie le chemin complet (/storage/sdcard0/Android/data/.../filename.ext), mais avec ce code, nous n'obtiendrons que le nom du fichier.

Code final:

Bundle extras = intent.getExtras();
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID));
Cursor c = YOUR_DM.query(q);

if (c.moveToFirst()) {
    int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
    if (status == DownloadManager.STATUS_SUCCESSFUL) {
        String filePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
        filename = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length() );
    }
}
c.close();

Modifier: Remplacez YOUR_DM par votre instance DownloadManager.

15
Mario Velasco

Je pense que ce que vous recherchez est le DownloadManager.COLUMN_TITLE

Voici un lien vers les documents Android: http://developer.Android.com/reference/Android/app/DownloadManager.html#COLUMN_TITLE

Et voici un tutoriel qui expliquera plus que l'obtention du titre. C'est pour télécharger une image à partir d'une URL et l'afficher ensuite dans une application. Puissant utile je pense, parlant en général.

http://wptrafficanalyzer.in/blog/downloading-an-image-from-an-http-url-using-downloadmanager-and-displaying-in-imageview-by-dynamically-registered-broadcastreceiver/

1
Siddharth Lele

u essayez ce code pour obtenir le nom du fichier

DownloadManager.COLUMN_LOCAL_FILENAME

je ne suis pas sûr de ça

0
Nithinlal