Подтвердить что ты не робот

Android DownloadManager получает имя файла

В моем приложении вы можете скачать несколько файлов. Для загрузки я использовал класс Android DownloadManager. После завершения загрузки он должен показать мне сообщение о том, что файл был загружен. Проблема в том, что одновременно может быть 2,3 или 4 загрузки. Мой код BroadcastReceiver выглядит следующим образом:

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

Как я могу получить текущее имя файла для окончательной загрузки?

Большое спасибо.

4b9b3361

Ответ 1

Я думаю, вы хотите добавить что-то вроде этого в свой блок if. Замените YOUR_DM вашим экземпляром 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
    }
}

Ответ 2

Ян Шеннон был абсолютно прав с его ответом, но я немного улучшил ситуацию:
  • Не забудьте закрыть это Cursor после его использования, избегая "Утечка курсора". Этот Cursor потребляет много ресурсов и должен быть выпущен как можно скорее.

  • Если вы поместили какой-то заголовок для загрузки, например:

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

    Значение, заданное DownloadManager.COLUMN_TITLE, будет "Some title" вместо имени файла. Поэтому я рекомендовал бы это вместо:

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

    COLUMN_LOCAL_FILENAME возвращает весь путь (/storage/sdcard0/Android/data/.../filename.ext), но с этим кодом мы получим имя файла.

Конечный код:

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

Изменить: Заменить YOUR_DM вашим экземпляром DownloadManager.

Ответ 3

Я думаю, что вы ищете DownloadManager.COLUMN_TITLE

Вот ссылка на документы Android: http://developer.android.com/reference/android/app/DownloadManager.html#COLUMN_TITLE

И вот учебник, который объяснит больше, чем просто получение названия. Он предназначен для загрузки изображения с URL-адреса, а затем его отображения в приложении. Могущественный полезный, я думаю, в целом.

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

Ответ 4

u попробуйте этот код, чтобы получить имя файла

DownloadManager.COLUMN_LOCAL_FILENAME

Я не уверен в этом

Ответ 5

Существует более простой способ получить URI загруженного файла, а именно с 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);

    }
}

Я нашел этот метод здесь в полном описании того, как использовать BroadcastReceiver для обработки событий DOWNLOAD_COMPLETE.