2012-09-19 5 views
7

DownloadManager scheint die richtige Wahl für eine App mit vielen Hintergrund-Downloads auf einer flockigen mobilen Internetverbindung zu sein.Android DownloadManager: Download schlägt fehl, aber COLUMN_REASON gibt nur "Platzhalter" zurück

Tutorial Code im Web gefunden, ist die App der Lage, einen Download des Systems DM verlangen etwa so:

// in onCreate() 
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 

// in requestData() 
Uri u = Uri.parse("http://server:8000/feed/data"); 
Request dreq = new Request(u); 
dreq.setNotificationVisibility(Request.VISIBILITY_HIDDEN); 
downloadID = dm.enqueue(dreq); 

Die URL in diesem Code ein Test-Server auf einem lokalen Computer ist. Die URL funktioniert, der Browser im Android-Emulator kann die Seite abrufen, und der Server gibt den HTTP-Code 200 zurück, wenn meine App diese Seite über den DownloadManager und den oben angegebenen Code anfordert.

Dies ist der entsprechende Code im ACTION_DOWNLOAD_COMPLETE BroadcastReceiver, der aufgerufen wird, wenn DM die Datei abgerufen hat.

Query q = new Query(); 
q.setFilterById(downloadID); 
Log.i("handleData()", "Handling data"); 
Cursor c = dm.query(q); 
if (c.moveToFirst()) { 
    Log.i("handleData()", "Download ID: " + downloadID + "/" + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_ID))); 
    Log.i("handleData()", "Download Status: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))); 
    if (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) { 
    String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 
    Log.i("handleData()", "Download URI: " + uriString); 
    } else if (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_FAILED) { 
    Log.i("handleData()", "Reason: " + c.getString(c.getColumnIndex(DownloadManager.COLUMN_REASON))); 
    } 
} 

Das seltsame Ergebnis ist dieses:

Die DOWNLOAD_STATUS ist 16 (oder STATUS_FAILED), aber der Grund ist "Platzhalter".

Warum ist das? Warum schlägt es fehl, wenn der Server einen 200-Statuscode zurückgegeben hat? Und warum gibt es keinen Grund für den DownloadManager?

Antwort

14

Beantworten Sie mich hier.

Hier ist das Problem: COLUMN_REASON ist keine Zeichenfolge, sondern ein Zahlenwert.

Log.i("handleData()", "Reason: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON))); 

wird einen tatsächlichen Fehlercode zurückgeben, mit dem man arbeiten kann.

+0

wo ich sehen kann, was Grund bedeutet, was – Nick

+1

Es gibt mehrere mögliche Werte in der [DownloadManager API doc] (http://developer.android.com/reference/android/app/DownloadManager.html) - suchen Sie nach " Wert von COLUMN_REASON "auf dieser Seite. – hez

Verwandte Themen