2012-09-19 8 views
7

DownloadManager parece ser la opción correcta para una aplicación con muchas descargas en segundo plano en una conexión de Internet móvil escasa.Android DownloadManager: La descarga falla, pero COLUMN_REASON solo devuelve "marcador de posición"

Usando código tutorial encontrado en la web, la aplicación es capaz de solicitar una descarga desde el sistema de DM de este modo:

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

La dirección URL en el que el código es un servidor de prueba en un equipo local. La URL funciona, el navegador en el emulador de Android puede recuperar la página y el servidor devuelve el código HTTP 200 cuando mi aplicación solicita esa página a través de DownloadManager y el código mencionado anteriormente.

Este es el código relevante en el ACTION_DOWNLOAD_COMPLETE BroadcastReceiver que se llama cuando DM ha recuperado el archivo.

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

El resultado extraño es esto:

El DOWNLOAD_STATUS es 16 (o STATUS_FAILED), pero la razón es "marcador de posición".

¿Por qué es eso? ¿Por qué falla cuando el servidor devolvió un código de estado 200? ¿Y por qué no hay ninguna razón dada por DownloadManager?

Respuesta

14

Respondiendo a mí mismo aquí.

Aquí está el problema: COLUMN_REASON no es una cadena, sino un valor numérico.

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

devolverá un código de error real con el que se puede trabajar.

+0

donde puedo ver lo que significa la razón – Nick

+1

Existen varios valores posibles enumerados en el [API de DownloadManager doc] (http://developer.android.com/reference/android/app/DownloadManager.html) - busque " Valor de COLUMN_REASON "en esa página. – hez

Cuestiones relacionadas