wake-up-neo.com

Android DownloadManager Dateiname abrufen

In meiner App können Sie einige Dateien herunterladen. Ich habe die Android-Klasse DownloadManager zum Herunterladen verwendet. Nachdem der Download abgeschlossen ist, sollte eine Meldung angezeigt werden, dass die Datei heruntergeladen wurde. Das Problem ist, dass 2,3 oder 4 Downloads gleichzeitig möglich sind. Mein BroadcastReceiver-Code sieht folgendermaßen aus:

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();
                }
         }
     };

Wie bekomme ich den aktuellen Dateinamen des fertigen Downloads?

Vielen Dank.

22
user1456060

Ich denke, Sie möchten so etwas in Ihren if-Block einfügen. Ersetzen Sie YOUR_DM durch Ihre DownloadManager-Instanz.

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 hatte mit seiner Antwort absolut recht, aber ich möchte einige Verbesserungen vorschlagen:

  • Denken Sie daran, das Cursor nach der Verwendung zu schließen, um ein "Cursor-Leaking" zu vermeiden. Diese Cursor verbraucht eine Menge Ressourcen und muss so schnell wie möglich freigegeben werden. 

  • Wenn Sie einen Titel für den Download eingeben, z.

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

    Der von DownloadManager.COLUMN_TITLE angegebene Wert ist "Some title" anstelle des Dateinamens. Also würde ich das stattdessen empfehlen:

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

    COLUMN_LOCAL_FILENAME gibt den gesamten Pfad (/storage/sdcard0/Android/data/.../filename.ext) zurück, aber mit diesem Code erhalten wir nur den Dateinamen.

Schlusscode:

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();

Bearbeiten: Ersetzen Sie YOUR_DM durch Ihre DownloadManager-Instanz.

15
Mario Velasco

Ich denke, was Sie suchen, ist der DownloadManager.COLUMN_TITLE

Hier ist ein Link zu den Android Dokumenten: http://developer.Android.com/reference/Android/app/DownloadManager.html#COLUMN_TITLE

Und hier ist ein Tutorial, das mehr erklärt als nur den Titel zu bekommen. Es dient dazu, ein Bild von einer URL herunterzuladen und dann in einer Anwendung anzuzeigen. Mighty nützlich, denke ich, insgesamt zu sprechen.

http://wptrafficanalyzer.in/blog/downloading-an-image-von-an-http-url- using-downloadmanager-und-displaying-in-imageview-von-dynamisch-registriert-broadcastreceiver/

1
Siddharth Lele

Es gibt eine einfachere Möglichkeit, die heruntergeladene Datei-URI abzurufen, und zwar mit getUriForDownloadedFile:

download_receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle b = intent.getExtras();
        DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        long file_id = b.getLong(DownloadManager.EXTRA_DOWNLOAD_ID);
        Uri uri = dm.getUriForDownloadedFile(downloaded_file_id);

    }
}

Ich fand diese Methode hier in einer vollständigen Beschreibung, wie ein BroadcastReceiver zum Behandeln von DOWNLOAD_COMPLETE-Ereignissen verwendet wird.

0
Sean Pianka

versuchen Sie diesen Code, um den Dateinamen abzurufen

DownloadManager.COLUMN_LOCAL_FILENAME

ich bin mir nicht sicher

0
Nithinlal