2012-06-01 8 views
5

Dobra, pobieram pliki (obrazy). Chcę wysłać wiadomość z lokalnym identyfikatorem URI dla obrazu po zakończeniu pobierania. Ale 20% czasu jestem coraz to:Menedżer pobierania wysyła STATUS_SUCCESSFUL dla nieudanego pobrania

6-01 18:46:39.900: INFO/DownloadManager(412): Initiating request for download 605 
06-01 18:46:39.910: WARN/DownloadManager(412): Aborting request for download 605: Trying to resume a download that can't be resumed 
06-01 18:46:39.910: INFO/ololo(2826): Okay, I'll broadcast. 
06-01 18:46:39.990: WARN/ImageView(2826): Unable to open content: content://downloads/my_downloads/605 
    java.io.FileNotFoundException: No filename found. 
    at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:145)... 
06-01 18:46:39.990: INFO/System.out(2826): resolveUri failed on bad bitmap uri: content://downloads/my_downloads/605 
06-01 18:46:39.990: INFO/ololo(2826): content://downloads/my_downloads/605 was set for [email protected] 

Oto kod

Long downloadId = downloadIds.get(this); 

if(downloadId == intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)) { 
    DownloadManager.Query query = new DownloadManager.Query(); 
    query.setFilterById(downloadId); 
    Cursor cursor = downloadManager.query(query); 

    if(cursor.moveToFirst()) { 

     switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))) { 
      case DownloadManager.STATUS_SUCCESSFUL : { 
       Log.i("ololo", "Okay, I'll broadcast."); 
       // Broadcasting 
       break; 
      } 
      case DownloadManager.STATUS_FAILED : { 
       Log.i("ololo", "Bad, I won't broadcast."); 
       int reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)); 
       if(reason == DownloadManager.ERROR_CANNOT_RESUME || reason == DownloadManager.ERROR_UNKNOWN) { 
        // Rerun download 
       } 
       break; 
      } 
      default: 
       break; 
     } 
    } 
} 
+0

Witam, mam ten sam problem. czy w jakiś sposób go rozwiązałeś lub zrozumiałeś, co jest nie tak? –

+0

@TalKanel Problem występuje TYLKO z urządzeniami Samsung (Galaxy Tab 10.1 lub czymś innym, w wersji 3.2 lub 2.3.3 lub 4.0 - to nie ma znaczenia, nigdy nie zdarzyło się żadnemu HTC). Myślę, że istnieje ich własna _buggy_ realizacja 'DownloadManager'. Tak więc mój lider zespołu napisał własną realizację i działa dobrze. – efpies

+0

szkoda, potrzebuję go używać w tabletach Samsung P7510 i P5110 (GALAXY TAB 10.1 ONE and TWO), i potrzebuję go do pracy nad konkretnymi wersjami systemu operacyjnego, o których wspomniałeś .. więc myślę, że muszę implementować moje własne obejście. –

Odpowiedz

5

DownloadManager zawiera błędy i nie działa prawidłowo. Ten błąd został złożony z Google jakiś czas temu:

https://code.google.com/p/android/issues/detail?id=18462

Dla pojedynczego pliku, można obejść ten podając unikalny katalog do pobrania na specjalnie do tego celu, i po prostu wziąć, co można dostać w tym katalogu na DownloadManager.STATUS_SUCCESSFUL.
W przypadku pobierania wielu plików nie mogę obecnie myśleć o obejściu tego problemu, chyba że istnieje możliwość zmiany nazwy plików u źródła.

+0

Myślę, że to zadziała w twoim przypadku: http://papaya-backend.net/2013/04/12/why-http-etag-header-may-cause-your-downloading-apps-on-android-failed/ – CoDe

+0

Tak, użycie tagów HTTP prawdopodobnie rozwiąże ten problem. Jednak użycie tagów HTTP ETag jest opcjonalne w specyfikacji HTTP i dlatego użycie ETag do rozwiązania tego problemu zależy od bezpośredniego dostępu administratora do serwera w celu dodania obsługi ETags. Nadal twierdzę, że DownloadManager jest błędny, ponieważ nie działa bez wsparcia ETags. – Phileo99

+0

Mam do czynienia z nieco podobny problem ... pobieranie STATUS_FAILED do uruchamiania pobierania ... masz pojęcia, dlaczego? – CoDe

Powiązane problemy