Android DownloadManager и сканер мультимедиа

Я пытаюсь загрузить изображение через DownloadManager, чтобы оно отображалось в приложении «Галерея», но ничего из того, что я делаю, не работает. Согласно документации, я подумал, что этого кода будет достаточно:

  public void downloadImage(String url) {
        Uri Download_Uri = Uri.parse(url);
        DownloadManager.Request request = new DownloadManager.Request(Download_Uri);
        request.allowScanningByMediaScanner();
        download_id = downloadManager.enqueue(request);
  }

Но когда файл загружается, он не отображается в приложении «Галерея». Поэтому я попытался загрузить приемник, чтобы добавить его вручную, например:

 BroadcastReceiver receiver = new BroadcastReceiver() {
     @Override
     public void onReceive(Context context, Intent intent) {
         String action = intent.getAction();
         if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
             long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
             Query query = new Query();
             query.setFilterById(downloadId);
             Cursor c = downloadManager.query(query);
             if (c.moveToFirst()) {
                 int columnIndex = c
                         .getColumnIndex(DownloadManager.COLUMN_STATUS);
                 if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
                     String uriString = downloadManager.getUriForDownloadedFile(download_id).toString(); 
                             //c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                     Log.i("filname", uriString);
                     MediaScannerConnection.scanFile(ArticleActivity.this,
                              new String[] { uriString }, null,
                              new MediaScannerConnection.OnScanCompletedListener() {
                          public void onScanCompleted(String path, Uri uri) { 
                              Log.i("Media Scanner", "Scanned " + path + ":");
                              Log.i("Media Scanner", "-> uri=" + uri);
                          }
                     });
                 }
             }
         }
     }
 };

Это тоже не работает. URI, напечатанный с тегом «имя файла», выглядит примерно так: «content://downloads/my_downloads/97» вместо имени фактического загруженного файла. В приложении для загрузки имя файла такое же, как и на сервере. Uri, зарегистрированный с тегом «Сканер мультимедиа», имеет значение null.

Я пропустил что-то простое здесь? Я рвал на себе волосы несколько часов.


person John    schedule 29.03.2014    source источник


Ответы (2)


Я понял. Пришлось добавить место загрузки. Следующая строка исправляет это.

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, Download_Uri.getLastPathSegment());
person John    schedule 04.04.2014

Принятый ответ был правильным для меня, пока я не протестировал его в Android 6.0. Я не уверен, что это недокументированное изменение, но downloadManager.getUriForDownloadedFile(download_id) всегда возвращает мне URI типа content://downloads/my_downloads/97, независимо от того, устанавливаю ли я место назначения файла в запросе на загрузку.

Как я это исправил, используя курсор из менеджера загрузок:

Query query = new Query();
query.setFilterById(downloadId);
Cursor cursor = downloadManager.query(query);
if (cursor.moveToFirst()) {
    String filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
}
person rorlork    schedule 15.10.2015